2012-06-11 9 views
13

Wir verwenden die HTTPWebRequest Objekte, um HTTP-Anfragen an unsere Anwendung zu machen, und wir haben ein Problem, wenn die Anfrage Authentifizierung erfordert und es einen transparenten Proxy (Squid 3.1.10).HTTPWebRequest.GetResponse() fehlgeschlagen mit authentifizierten Anfragen über einen transparenten 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(); 

Unser ursprünglicher Code verwendete die Klasse WebClient, die das gleiche Problem aufwies.

Wenn dieser Code das erste Mal ausgeführt wird, wird das Ergebnis korrekt angezeigt. Wenn der Code ein zweites Mal ausgeführt wird, schlägt es auf der GetResponse() Linie mit:

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 ... 

auf Windows 7, den Prozess neu zu starten bewirkt, dass es einmal erholen und arbeiten, aber Server 2003 erfordert einen vollständigen Neustart.

Mit Blick auf den network capture, zwei Anforderungen sind identisch mit dem Anfang nicht authentifizierte Anforderung starten gesendet wird und der Server antwortet, aber die lassen Anfragen scheitern, senden die zweite authentifizierte Anforderung in der Mitte der ersten Antwort, als ob es die Content-Length ignorieren Header (was korrekt ist). Es empfängt dann den Rest der ersten Antwort und schlägt mit dem Protokollfehler fehl.

Wireshark capture

Es ist seltsam erscheinen, dass der Client (HTTPWebRequest) schließt nicht die Verbindung jedoch sauber.

Wenn der Proxy nicht verwendet wird (nicht Port 80 oder interner Datenverkehr), funktionieren alle Anfragen wie erwartet. Wenn es keine Authentifizierung gibt, funktioniert es auch, da es nur die einzige Anfrage macht.

Ich habe bereits den Problemcode auf das Minimum reduziert und reproduziert es mit dem MSDN-Beispiel, aber weiß jemand, ob dies ein bekanntes Problem oder ein Problem in unserer (.NET oder Squid) Konfiguration ist?

+0

Nicht sicher, ob dies das Problem ist, aber stellen Sie sicher, dass Sie Ihren StreamReader schließen, wenn Sie fertig sind? –

+0

Danke für das Hinzufügen des Screenshots. Haben Sie Autorisierungsinformationen aus dem ersten GET entfernt oder enthielt es keine? –

+0

Ich habe meine Antwort entfernt, da es klar ist, dass es nicht zutrifft. –

Antwort

1

Da es nur das zweite Mal ausfällt, würde

request.KeepAlive = false; 

einen Unterschied machen?

+0

Es [tut] (http://stackoverflow.com/questions/10984264/httpwebrequest-getresponse-failing-with-authenticated-requests-through-a-trans/11190526#comment14393611_10984264), aber ich bin ungern, das als zu verwenden Permanant beheben, da es eher eine Problemumgehung als eine Lösung für das anfängliche Problem ist. Ich werde es trotzdem akzeptieren – Deanna

0

Ich denke, NTLM-Authentifizierung (NetworkCredential) funktioniert nicht gleichzeitig mit transparenten Proxy-Funktion von SQUID. :-(

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

Könnten Sie ein anderes Authentifizierungsschema versuchen?

+0

Ich verwende keine NTLM-Authentifizierung. Das 'NetworkCredential'-Objekt ist schemagnostisch. Der Proxy wird nicht authentifiziert, nur die HTTP-Ressource, die wir anfordern, mit der Standardauthentifizierung. – Deanna

0

Versuchen Sie, sich zu authentifizieren , mit

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

vor dem request.GetResponse();

Das funktionierte für mich. Zuerst habe ich versucht, die ganze Saite selbst einzuspielen, was nicht funktioniert hat!