Сбой 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 требуется полная перезагрузка.
Что касается захвата сети, два запроса идентичны для начала, исходный запрос не прошедший проверку подлинности отправляется, и сервер отвечает, но отказавшие запросы отправляют второй проверенный запрос в середине исходного ответа, как будто он игнорирует Content-Length
заголовок (что правильно). Затем он получает оставшуюся часть исходного ответа и завершается ошибкой протокола.
Это кажется странным, что клиент (HTTPWebRequest
) не закрывает соединение чисто, хотя.
Когда прокси-сервер не используется (не порт 80 или внутренний трафик), все запросы работают должным образом. Когда аутентификация отсутствует, она также работает, поскольку выполняет только один запрос.
Я уже сократил код проблемы до минимума и воспроизвел его с примером MSDN, но кто-нибудь знает, является ли это известной проблемой или проблемой в нашей конфигурации (.NET или Squid)?
3 ответа
Так как это терпит неудачу только во второй раз, будет
request.KeepAlive = false;
Сделать разницу?
Попробуйте аутентифицировать себя с
request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password));
перед request.GetResponse();
Это сработало для меня. Сначала я попытался вставить всю строку, но это не сработало!
Я думаю, что аутентификация NTLM (NetworkCredential) не работает одновременно с функцией прозрачного прокси SQUID.:-(
http://www.squid-cache.org/mail-archive/squid-users/201110/0025.html
Не могли бы вы попробовать другую схему аутентификации?