Ошибка HTTPWebRequest.GetResponse() при аутентифицированных запросах через прозрачный прокси-сервер

Мы используем объекты 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(что правильно). Затем он получает остальную часть первоначального ответа и завершается ошибкой протокола.

Wireshark capture

Кажется странным, что клиент ( HTTPWebRequest) не закрывает соединение корректно.

Когда прокси-сервер не используется (не порт 80 или внутренний трафик), все запросы работают должным образом. Когда нет аутентификации, он также работает, поскольку делает только один запрос.

Я уже уменьшил код проблемы до минимума и воспроизвел его с образцом MSDN, но кто-нибудь знает, является ли это известной проблемой или проблемой в нашей (.NET или Squid) конфигурации?

13
задан Deanna 18 March 2014 в 08:48
поделиться