2012-06-11 15 views
13

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.

Wireshark capture

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)?

+0

Nie jesteś pewien, czy to jest problem, ale czy zamykasz StreamReader po zakończeniu? –

+0

Dziękujemy za dodanie zrzutu ekranu. Czy usunąłeś informacje o autoryzacji z pierwszego GET w nim, czy po prostu nie zawierał żadnych? –

+0

Usunąłem moją odpowiedź, ponieważ jest jasne, że nie ma ona zastosowania. –

Odpowiedz

1

Ponieważ nie tylko po raz drugi, by

request.KeepAlive = false; 

zrobić różnicę?

+0

It [does] (http://stackoverflow.com/questions/10984264/httpwebrequest-getresponse-failing- with-authenticated-requests-through-a-trans/11190526#comment14393611_10984264), ale jestem niechętny, aby użyć tego jako stała poprawka, ponieważ jest bardziej rozwiązaniem, a nie poprawą początkowego problemu. I tak to zaakceptuję – Deanna

0

Myślę, że uwierzytelnianie NTLM (NetworkCredential) nie działa w tym samym czasie z przezroczystą funkcją proxy SQUID. :-(

http://www.squid-cache.org/mail-archive/squid-users/201110/0025.html

można spróbować innego schematu uwierzytelniania?

+0

Nie używam uwierzytelniania NTLM. Obiekt 'NetworkCredential' jest niezależny od schematu. Serwer proxy nie jest w ogóle uwierzytelniany, tylko żądany zasób HTTP, z uwierzytelnianiem podstawowym. – Deanna

0

Spróbuj uwierzytelniania siebie , z

request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password)); 

przed request.GetResponse();

ten pracował dla mnie. Najpierw próbowałem włożyć cały łańcuch, który nie zadziałał!