Komprimierung (Header) Fehler in .NET HttpWebRequest?

9

Ich habe gerade gemerkt, dass ich mit der .NET HttpWebRequest keine gzip'd-Inhalte vom Server bekommen habe (läuft nginx 0.8.52). Beim Testen mit curl habe ich überprüft, dass gzip serverseitig richtig eingerichtet wurde, dann habe ich mich mit dem VS-Debugger beschäftigt.

Der Täter stellt sich heraus, wie das Kopfzeilenfeld Accept-Encoding erzeugt wird: wenn ich

einstelle %Vor%

Ich bekomme folgende Überschrift:

%Vor%

Wenn ich

einstelle %Vor%

Ich bekomme

%Vor%

Ich habe nicht überprüft, was die HTTP-Spezifikation sagt, aber nginx sollte die Situation behandeln, aber stattdessen gibt es Vary: Accept-Encoding zurück. Auf der anderen Seite sieht der Accept-Encoding Header, der von HttpWebRequest generiert wird, definitiv nicht richtig aus und scheint mir ein Fehler zu sein.

Wenn ich AutomaticDecompression nicht anführe und den Accept-Encoding Header manuell setze, bekomme ich gzip'd Inhalt zurück, aber HttpWebRequest scheint ziemlich dumm zu sein, und dekodiert den komprimierten Stream nicht (ich denke Es basiert auf einem internen IsCompressed -Flag, anstatt die Antwortheader zu analysieren.

Irgendwelche Vorschläge?

BEARBEITEN:

Es sollte angemerkt werden, dass es eine Authentifizierung gibt; Ich habe gerade herausgefunden, dass HttpWebRequest zunächst eine Anfrage ohne einschließlich der angegebenen Zugangsdaten durchführt. Für diese Anfrage wird der Header Accept-Encoding korrekt angegeben. Die Duplizierung tritt auf, nachdem die 401-Server-Antwort abgerufen und die Anforderung mit den Anmeldeinformationen erneut ausgeführt wurde.

EDIT 2:

Ich habe einen Fehlerbericht von Microsoft Connect veröffentlicht

    
snemarch 23.11.2010, 11:23
quelle

2 Antworten

5

Scheint ein Fehler zu sein. Mögliche Problemumgehungen:

  1. Verwenden Sie nicht AutomaticDecompression, setzen Sie das Header-Feld "Accept-Encoding" manuell und behandeln Sie die Dekomprimierung des Antwort-Streams manuell, wenn die Eigenschaft "Content-Encoding" eingestellt ist.
  2. Verwenden Sie nicht die Credentials-Eigenschaft, sondern erstellen Sie den HTTP-Autorisierungsheader manuell. Dies beseitigt unnötige Server-Roundtrips und behebt den Kopffeldkopierfehler.
snemarch 23.11.2010, 14:25
quelle
0

LOL, witzigerweise erwähnen Sie das, ich habe das gerade am Freitag notiert; P

Ich habe deswegen keine Probleme gesehen, meine Antwort ist immer noch komprimiert.

Ich habe auch die verschiedenen Proxy-Anfragen zur Kenntnis genommen. Aber ich kann nicht für das Leben von mir GZip-Komprimierung arbeiten über MS ISA oder die neue mit dem Long-Name-Server. Es scheint nur den Header der Anfrage zu entfernen, und der Server weiß es nicht einmal. Ich werde mich morgen mit einem unserer Netzwerkadministratoren treffen, um zu sehen, ob es sich um einen Proxy handelt.

Aktualisierung:

Ich sollte beachten, dass ich kein Problem damit habe, einen Squid-Proxy zwischen mir und dem Server zu platzieren, aber das war einfach eine Standardauthentifizierung und nicht das ausgefallene Challenge-Response-Zeug, das Windows / ISA verwendet.

Update 2:

Ich habe vergessen zu erwähnen, dass der Accept-Encoding-Header auch verschwindet, wenn Sie einen Browser verwenden, um auf die Site zuzugreifen. Aus diesem Grund denke ich, dass das eigentliche Problem nicht spezifisch für .NET ist. Das Testen wird fortgesetzt.

Update 3:

Ich habe eine Aufnahme mit FF3.6 gemacht, die über den ISA-Proxy lief und ziemlich genau das gleiche Ergebnis. Über ISA wird nur ein "einzelner" Proxy authentifiziert, aber die endgültige Antwort ist immer noch nicht komprimiert.

Angesichts der hohen Rate erblicher Käfer bei MS-Produkten müsste ich mich dafür entscheiden, dass ISA / FTMG der Schuldige ist.

Update 4 (gelöst):

Ich hatte gerade das Meeting und löste das Problem (wird später Screenie mit der entsprechenden Einstellung veröffentlichen). Also die Ahnung war richtig (zumindest in meinem Fall).

Ich würde dringend empfehlen, in die ISA / FTMG-Konfiguration zu schauen, wenn diese im Netzwerk verwendet wird, das den Server hostet.

Update 5 (gelöst, wirklich):

Versuchte eine andere Einstellung, und das war der "Trick". Auf dem FTMG-Proxy mussten wir die HTTP-Komprimierung für das "externe" Netzwerk aktivieren und sicherstellen, dass die komprimierbaren Inhaltstypen korrekt waren (musste application / soap + xml für WCF hinzugefügt werden). Dies ermöglicht dem Proxy, eine Komprimierung durchzuführen, und der tatsächliche Webserver tut dies nicht, was zwar ideal ist oder nicht, aber zumindest funktioniert es. :)

Ich würde dringend empfehlen, in die ISA / FTMG-Konfiguration zu schauen, wenn diese im Netzwerk verwendet wird, das den Server hostet.

Protokoll erfassen:

Hier ist meine Spur, die die Seite mit IE8 über Forefront TMG-Proxy erfasst, der mit Wireshark erfasst wurde. Wenn der Fehler .NET-spezifisch ist, würde ich erwarten, dass das Ergebnis anders ist, aber von dem, was ich sehe, verhält es sich genauso.

Erste Anfrage:

%Vor%

Authentifizieren mit Proxy, aber fehlschlägt?:

%Vor%

Abschließende Sequenz:

%Vor%     
leppie 23.11.2010 14:26
quelle

Tags und Links

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library '/opt/remi/php70/root/usr/lib64/php/modules/mongodb.so' - /opt/remi/php70/root/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory

$_GET = [
    'id' => '311652',
    'url' => 'compression-header-bug-in-net-httpwebrequest',
];

$_SESSION = [
    '__flash' => [],
];