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:
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.
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
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.
Tags und Links powershell