Ich bin in einer Situation, in der es eine völlig legale Methode ist, wenn der Server mir sagt, was mit meiner Anfrage nicht stimmte, wenn ich einen HTTP 400-Code vom Server erhalte (mithilfe einer Nachricht im HTTP-Antwortinhalt).
Die .NET HttpWebRequest löst jedoch eine Ausnahme aus, wenn der Statuscode 400 lautet.
Wie gehe ich damit um? Für mich ist eine 400 völlig legal und ziemlich hilfreich. Der HTTP-Inhalt enthält einige wichtige Informationen, aber die Ausnahme wirft mich von meinem Weg ab.
.net
httpwebrequest
Chefkoch
quelle
quelle
Antworten:
Es wäre schön, wenn es eine Möglichkeit gäbe, "Nicht-Erfolgscode auslösen" zu deaktivieren, aber wenn Sie WebException abfangen, können Sie zumindest die folgende Antwort verwenden:
Möglicherweise möchten Sie das Bit "Erhalten Sie mir eine Antwort, auch wenn es sich nicht um einen Erfolgscode handelt" in einer separaten Methode zusammenfassen. (Ich würde vorschlagen, dass Sie immer noch werfen, wenn es keine Antwort gibt, z. B. wenn Sie keine Verbindung herstellen konnten.)
Wenn die Fehlerantwort groß ist (was ungewöhnlich ist), möchten Sie möglicherweise eine Optimierung
HttpWebRequest.DefaultMaximumErrorResponseLength
vornehmen, um sicherzustellen, dass Sie den gesamten Fehler erhalten.quelle
Ich weiß, dass dies bereits vor langer Zeit beantwortet wurde, aber ich habe eine Erweiterungsmethode entwickelt, um hoffentlich anderen Menschen zu helfen, die zu dieser Frage kommen.
Code:
Verwendung:
quelle
WebException.Response
kann und kann seinnull
. Sie sollten erneut werfen, wenn dies der Fall ist.HttpClient
stattdessen verwenden sollten, es ist viel konfigurierbarer und ich glaube, es ist der Weg der Zukunft.((WebRequest) null).GetResponseWithoutException()
wird in der Tat kein a verursachenNullReferenceException
, da es auf das Äquivalent von kompiliert wirdWebRequestExtensions.GetResponseWithoutException(null)
, was nicht zu einem führen würdeNullReferenceException
, daher die Notwendigkeit einer Eingabevalidierung.Interessanterweise ist das
HttpWebResponse.GetResponseStream()
, was Sie von erhalten,WebException.Response
nicht dasselbe wie der Antwortstrom, den Sie vom Server erhalten hätten. In unserer Umgebung verlieren wir die tatsächlichen Serverantworten, wenn ein 400-HTTP-Statuscode mithilfe derHttpWebRequest/HttpWebResponse
Objekte an den Client zurückgegeben wird . Wie wir gesehen haben, wird der mit dem verknüpfte AntwortstromWebException's HttpWebResponse
auf dem Client generiert und enthält keinen Antworttext vom Server. Sehr frustrierend, da wir dem Kunden den Grund für die schlechte Anfrage mitteilen möchten.quelle
Ich hatte ähnliche Probleme beim Versuch, eine Verbindung zum OAuth2-Dienst von Google herzustellen.
Am Ende habe ich den POST manuell geschrieben und WebRequest nicht wie folgt verwendet:
Die Antwort, die in den Antwortstrom geschrieben wird, enthält den spezifischen Fehlertext, nach dem Sie suchen.
Insbesondere bestand mein Problem darin, dass ich Endlines zwischen URL-codierten Datenelementen platzierte. Als ich sie herausnahm, funktionierte alles. Möglicherweise können Sie eine ähnliche Technik verwenden, um eine Verbindung zu Ihrem Dienst herzustellen und den eigentlichen Antwortfehlertext zu lesen.
quelle
Versuchen Sie dies (es ist VB-Code :-):
quelle
Eine asynchrone Version der Erweiterungsfunktion:
quelle
Dies löste es für mich:
https://gist.github.com/beccasaurus/929007/a8f820b153a1cfdee3d06a9c0a1d7ebfced8bb77
TL; DR:
Problem:
localhost gibt den erwarteten Inhalt zurück, Remote-IP ändert 400 Inhalte in "Bad Request".
Lösung:
Hinzufügen,
<httpErrors existingResponse="PassThrough"></httpErrors>
umweb.config/configuration/system.webServer
dies für mich zu lösen; Jetzt geben alle Server (lokal und remote) genau den gleichen Inhalt (von mir generiert) zurück, unabhängig von der IP-Adresse und / oder dem HTTP-Code, den ich zurückgebe.quelle