Używamy obiektów HTTPWebRequest
do wysyłania żądań HTTP do naszej aplikacji i mamy problem, gdy żądanie wymaga uwierzytelnienia i istnieje przezroczysty serwer proxy (Squid 3.1.10).HTTPWebRequest.GetResponse() kończy się niepowodzeniem z uwierzytelnionymi żądaniami za pośrednictwem przezroczystego proxy
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();
Nasz oryginalny kod używany klasy WebClient, które wykazywały ten sam problem.
Po pierwszym uruchomieniu kodu wynik jest wyświetlany poprawnie. Gdy kod jest uruchamiany po raz drugi, to nie na linii GetResponse()
z:
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 ...
W Windows 7, ponowne uruchomienie procesu powoduje, że odzyskanie i działać raz, ale Server 2003 wymaga pełnego restartu.
Patrząc na network capture dwa wnioski są identyczne na początek, początkowy wniosek Nieuwierzytelniona są wysyłane i odpowiedzi serwera, ale wnioski niespełniające wysyła 2nd uwierzytelnione żądanie w środkowej części wstępnej odpowiedzi jakby to ignorując Content-Length
nagłówek (co jest poprawne). Następnie otrzymuje resztę początkowej odpowiedzi i kończy się niepowodzeniem z błędem protokołu.
Wydaje się dziwne, że klient (HTTPWebRequest
) nie zamknąć połączenie czysto choć.
Gdy serwer proxy nie jest używany (bez portu 80 lub ruchu wewnętrznego), wszystkie żądania działają zgodnie z oczekiwaniami. Gdy nie ma uwierzytelnienia, działa również tak, jak tylko tworzy pojedyncze żądanie.
Już zmniejszyłem problem do minimum i powielono go z próbką MSDN, ale czy ktoś wie, czy jest to znany problem, czy problem w naszej konfiguracji (.NET lub Squid)?
Nie jesteś pewien, czy to jest problem, ale czy zamykasz StreamReader po zakończeniu? –
Dziękujemy za dodanie zrzutu ekranu. Czy usunąłeś informacje o autoryzacji z pierwszego GET w nim, czy po prostu nie zawierał żadnych? –
Usunąłem moją odpowiedź, ponieważ jest jasne, że nie ma ona zastosowania. –