HTTPWebRequest.GetResponse() nicht mit authentifizierten requests über einen transparenten proxy

Sind wir mit den HTTPWebRequest Objekte, um HTTP-Anfragen zu unseren Antrag, und wir haben ein problem, wenn die Anfrage erfordert eine Authentifizierung, und es gibt einen transparenten proxy (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();

Unserer ursprünglichen code verwendet der WebClient-Klasse, die zeigten das gleiche problem.

Ersten mal dieser code ausgeführt wird, zeigt das Ergebnis richtig.
Wenn der code ein zweites mal ausgeführt wird, schlägt es auf die GetResponse() Zeile 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, Neustart der Prozess der Sie verursacht, zu erholen und zu einmal Arbeit, aber Server 2003 ist ein voller Neustart.

Blick auf die Netzwerk erfassen, beiden Anforderungen identisch sind, mit zu beginnen, die erste nicht authentifizierte Anfrage gesendet und der server antwortet, aber die fehlerhafte Anfragen sendet die 2. authentifizierte Anfrage in der Mitte der ersten Antwort, als ob es ignoriert die Content-Length header (was richtig ist). Es bekommt dann den rest der ersten Antwort und schlägt mit der Protokoll-Fehler.

HTTPWebRequest.GetResponse() nicht mit authentifizierten requests über einen transparenten proxy

Es scheint merkwürdig, dass der client (HTTPWebRequest) nicht schließen die Verbindung sauber obwohl.

Wenn der proxy nicht benutzt wird (nicht port 80 oder interner traffic) die Anforderungen alle arbeiten wie erwartet. Wenn es keine Authentifizierung, es funktioniert auch so, es macht nur den einzigen Wunsch.

Habe ich bereits reduziert das problem-code auf das minimum und reproduziert es mit der MSDN-Beispiel, aber weiß jemand, ob dies ein bekanntes Problem oder ein problem in unserer (.NET oder Squid) Konfiguration?

  • Nicht sicher, ob dies ist, wo das Problem liegt, aber sind Sie sicher, schließen Sie Ihre StreamReader, wenn Sie fertig sind?
  • Vielen Dank für das hinzufügen der Abbildung. Hast du strip-Autorisierungs-Informationen aus der ersten BEKOMMEN, oder hat es einfach keine?
  • Habe ich entfernt, meine Antwort, da ist es klar, dass es nicht gilt.
  • Das tut Sie nie, das ist, normale HTTP-Verhalten. Zuerst schicken Sie die Anfrage nicht authentifiziert ist, dann auf die Herausforderung, senden Sie die korrekten details.
  • Ich wusste nicht, dass. Vielen Dank für das lassen mich wissen. Da das Ziel der Anwendung liegt bei Ihnen, wie ist die ContentLength gesetzt? Ich weiß, ich hatte Probleme auf einem Projekt in der Vergangenheit versucht zu generieren die richtige ContentLength mich, da es die Größe in Anzahl der bytes, sondern als Zeichen der Antwort.
  • Es ist "nur-text" konvertiert (lokale codepage) in ein byte-array, welches dann an die Funktion übergeben, die erzeugt den header mit der Größe entnommen, dass byte-array. Sie haben mich dazu veranlasst, zu versuchen, auf eine andere Art von server, obwohl zu beseitigen, die unseren code ganz...
  • Hoffe, es funktioniert für Sie heraus. Sorry, ich konnte nicht helfen, finden Sie die root-Problem selbst. Ich glaube, ich war versucht, einen ähnlichen Ansatz in der Vergangenheit und immer Probleme wegen der Größe nicht die gleiche wie die Größe des byte-Arrays. Ich erinnere mich nicht, was ich getan habe, es funktioniert aber.
  • Meh, genau das gleiche problem mit einem test PHP-Skript :o( ausschalten .KeepAlive auch behebt es, aber ich würde es vorziehen, nicht zu tun, dass für die Leistung)
  • Können Sie umgehen den proxy für die Authentifizierung, und dann, wenn Sie es wirklich benötigen, für die der Cache-Inhalt ermöglichen, den Verkehr durch an diesem Punkt?
  • Es ist nicht eine explizite proxy-Konfiguration, es ist transparent und konfiguriert ist, das gateway für alle port-80-Verkehr. Darüber hinaus ist dies ein kommerzielles Produkt ist-wir haben also keine Kontrolle über die Konfiguration der Benutzer das Netzwerk.
  • Können Sie nach dem Gespräch sans-proxy für den Vergleich?
  • Vielleicht morgen, aber es ist deutlich Connection: Close auf der server-Seite, es ist nur 2 einzelne Anfragen, nichts besonderes.
  • Kann man wireshark laufen und bekommen ein raw dump von einer Transaktion, sowohl mit als auch ohne proxy? Wenn Sie nicht auf dem client-Ende, kann man es verkaufen? Transparente proxies manchmal-Protokoll Verknüpfungen und andere Dinge tun, die Sie weniger transparent, als wären Sie ideal. Es ist möglich, dass etwas, was der proxy tut, die einen TCP-IP-Ebene blockiert.
  • Ich zweiten Wug ' s Anfrage. Wäre hilfreich zu sehen, die Arbeits-Reaktion sowie der vorhandenen gebrochene Antwort. Die Antwort beinhaltet keinen encoding-type im Content-Type-http-header-Feld. Können Sie auch bestätigen, die Größe der Antwort ist 3722 bytes?
  • Es ist aufgeteilt auf ein paar Anfragen, aber hier ist ein Paket cpature zeigt die ursprüngliche Anfrage (dass funktioniert), gefolgt von einem subsequant Anfrage (nicht, dass). Wenn der proxy nicht benutzt wird, der server unterstützt nur Connection: Close damit das Problem nicht auftaucht. In allen Fällen scheint der client forcable schließen Sie die Buchse (RST), anstatt ausgehandelt Herunterfahren.
  • Haben Sie versucht manuell hinzufügen wwww-auhenticate header?

InformationsquelleAutor Deanna | 2012-06-11
Schreibe einen Kommentar