Warum sind Invoke-WebRequest und Invoke-RestMethod gleichzeitig fehlgeschlagen und erfolgreich?

8

Ich habe ein kleines PowerShell-Skript geschrieben, um eine Anfrage an einen Server zu senden und ein einfaches XML-Ergebnis zurück zu bekommen.

PowerShell-Skript

%Vor%

Das ist es, wirklich einfach und es gibt keinen Grund, dass ich sehen kann, dass es scheitert. Ich habe auch das Skript mit Invoke-WebRequest ausprobiert und beide scheitern. Der zurückgegebene Fehler ist Invoke-RestMethod : Value cannot be null. Parameter name: name . Das Seltsame ist, dass wenn ich dies mit Wireshark beobachte, sehe ich die Verbindung, ich sehe die POST und ich sehe das Ergebnis vom Server und alles sieht sehr gut aus, aber das Cmdlet sagt es gescheitert (und ja, die Rückkehrcode ist 200).

Wenn ich Invoke-WebRequest / Invoke-RestMethod mit dem Parameter -OutFile ausfühle, läuft es fehlerfrei und speichert das Ergebnis in der angegebenen Datei. -OutVariable schlägt fehl, falls Sie sich fragen.

Das Ergebnis ist eine XML-Datei, die Header geben an, dass es xml ist und das XML korrekt formatiert ist.

Ergebnis wenn erfolgreich

%Vor%

Weiß jemand, warum die Cmdlet Invoke-XXX einen Fehler zurückgeben und was ich tun kann, um es zu beheben? Auch hier funktioniert es einwandfrei, wenn ich den Parameter -OutFile verwende. Selbst wenn dies fehlschlägt, kann ich eine richtige Konversation zwischen dem Skript und dem Server in Wireshark sehen.

Wenn ich -Verbose verwende, sagt es mir Folgendes:

%Vor%

Dabei ist X-byte die tatsächliche Größe der Antwort, unterscheidet sich jedoch offensichtlich bei jeder Antwort in Abhängigkeit von den an den Server gesendeten Daten. Ich finde es nur seltsam, dass das Cmdlet fehlschlägt, sagt aber, dass es eine Antwort mit Daten erhalten hat und dass es eine -1-byte Nutzlast gesendet hat.

    
vane 29.03.2016, 04:43
quelle

1 Antwort

7

Ich ging weiter und schaute in den Code Invoke-WebRequest Cmdlet und fand heraus, warum es mit diesem speziellen Fehler fehlschlägt.

Bei einem Aufruf von System.Globalization.EncodingTable.GetCodePageFromName schlägt es fehl. Die Codierung wird an diese Funktion als Parameter übergeben und die Codierung wird vom Cmdlet über den Header Content-Type abgerufen. Bei diesem Server wurde der Content-Type in der Antwort als Content-Type: application/xml; charset="UTF-8" zurückgesendet.

Das Problem dabei ist, dass die Anführungszeichen nicht Standard sind, um den Wert in charset zu verpacken, so dass das Cmdlet es als "UTF-8" anstelle der gültigen UTF-8 parst. Das Cmdlet übergibt "UTF-8" an die Funktion und die Funktion löst eine Ausnahme aus, die besagt, dass die angegebene Codierung ungültig ist. Das ist in Ordnung und würde viel mehr Sinn machen, wenn das in der letzten Ausnahme berichtet wird, aber nicht.

Die Ungültige Kodierungsausnahme wird von der Funktion Microsoft.PowerShell.Commands.ContentHelper.GetEncodingOrDefault abgefangen und ruft im Ausnahmehandler GetEncoding erneut auf, jedoch mit einem Nullparameter, der zum endgültigen ArgumentNullException für den Parameter name führt.

Microsoft.PowerShell.Commands.ContentHelper.GetEncodingOrDefault

%Vor%

Der Aufruf von GetEncoding in der catch-Anweisung löst den folgenden Code in GetCodePageFromName aus, der wiederum von GetEncoding

aufgerufen wird %Vor%

PowerShell behandelt dies richtig, da es technisch gesehen ein ungültiger Wert ist, aber Sie würden denken, dass sie Trim("\"") aufrufen würden, nur um sicher zu sein.

    
vane 02.04.2016, 02:08
quelle

Tags und Links