Мы используем объекты HTTPWebRequest
для выполнения HTTP-запросов к нашему приложению, и у нас возникает проблема, когда запрос требует аутентификации и имеется прозрачный прокси (Squid 3.1.10) .
string url = "http://www.icode.co.uk/test/auth.php";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Credentials = new NetworkCredential("username", "password");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);
MessageBox.Show(reader.ReadToEnd());
reader.Close();
stream.Close();
response.Close();
В нашем исходном коде использовался класс WebClient, который имел ту же проблему.
При первом запуске этот код правильно отображает результат.
Когда код запускается во второй раз, происходит сбой в строке GetResponse()
:
System.Net.WebException was unhandled
Message="The server committed a protocol violation. Section=ResponseStatusLine"
Source="System"
StackTrace:
at System.Net.HttpWebRequest.GetResponse()
at Dummy.DummyForm.button1_Click(Object sender, EventArgs e) in H:\Trial\Dummy\DummyForm.cs:line 42
at ...
В Windows 7 перезапуск процесса приводит к его восстановлению и работе один раз, но для Server 2003 требуется полная перезагрузка.
Глядя на сетевой захват, два запроса идентичны для начала, первоначальный неаутентифицированный запрос отправляется, и сервер отвечает, но неудачные запросы отправляют 2-й аутентифицированный запрос в середине начального ответа. как будто он игнорирует заголовок Content-Length
(что правильно). Затем он получает остальную часть первоначального ответа и завершается ошибкой протокола.
Кажется странным, что клиент ( HTTPWebRequest
) не закрывает соединение корректно.
Когда прокси-сервер не используется (не порт 80 или внутренний трафик), все запросы работают должным образом. Когда нет аутентификации, он также работает, поскольку делает только один запрос.
Я уже уменьшил код проблемы до минимума и воспроизвел его с образцом MSDN, но кто-нибудь знает, является ли это известной проблемой или проблемой в нашей (.NET или Squid) конфигурации?