Antworten:
Vielleicht so etwas ...
try
{
// ...
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError)
{
var response = ex.Response as HttpWebResponse;
if (response != null)
{
Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
}
else
{
// no http status code available
}
}
else
{
// no http status code available
}
}
Mit dem nullbedingten Operator ( ?.
) können Sie den HTTP-Statuscode mit einer einzigen Codezeile abrufen:
HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;
Die Variable status
enthält die HttpStatusCode
. Wenn ein allgemeinerer Fehler wie ein Netzwerkfehler auftritt, bei dem niemals ein HTTP-Statuscode gesendet status
wird, ist dieser Wert null. In diesem Fall können Sie überprüfen ex.Status
, um die zu erhalten WebExceptionStatus
.
Wenn Sie nur möchten, dass eine beschreibende Zeichenfolge im Falle eines Fehlers protokolliert wird, können Sie den Null-Coalescing-Operator ( ??
) verwenden, um den entsprechenden Fehler abzurufen:
string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
?? ex.Status.ToString();
Wenn die Ausnahme aufgrund eines 404-HTTP-Statuscodes ausgelöst wird, enthält die Zeichenfolge "NotFound". Wenn der Server hingegen offline ist, enthält die Zeichenfolge "ConnectFailure" usw.
(Und für alle, die wissen möchten, wie sie den HTTP-Subcode erhalten. Dies ist nicht möglich. Es handelt sich um ein Microsoft IIS-Konzept, das nur auf dem Server protokolliert und nie an den Client gesendet wird.)
?.
Operator während der Vorschau-Freigabe ursprünglich als Null-Propagierungsoperator oder als Null-Bedingungsoperator bezeichnet wurde. Atlassian resharper warnt jedoch davor, in solchen Szenarien den Null-Propagierungsoperator zu verwenden. Gut zu wissen, dass es auch als nullbedingter Operator bezeichnet wird.
Dies funktioniert nur, wenn WebResponse eine HttpWebResponse ist.
try
{
...
}
catch (System.Net.WebException exc)
{
var webResponse = exc.Response as System.Net.HttpWebResponse;
if (webResponse != null &&
webResponse.StatusCode == System.Net.HttpStatusCode.Unauthorized)
{
MessageBox.Show("401");
}
else
throw;
}
(Mir ist klar, dass die Frage alt ist, aber sie gehört zu den Top-Hits bei Google.)
Eine häufige Situation, in der Sie den Antwortcode wissen möchten, ist die Ausnahmebehandlung. Ab C # 7 können Sie den Mustervergleich verwenden, um die catch-Klausel nur dann einzugeben, wenn die Ausnahme mit Ihrem Prädikat übereinstimmt:
catch (WebException ex) when (ex.Response is HttpWebResponse response)
{
doSomething(response.StatusCode)
}
Dies kann leicht auf weitere Ebenen erweitert werden, wie in diesem Fall, in dem dies WebException
tatsächlich die innere Ausnahme eines anderen war (und wir nur daran interessiert sind 404
):
catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)
Zum Schluss: Beachten Sie, dass die Ausnahme in der catch-Klausel nicht erneut ausgelöst werden muss, wenn sie nicht Ihren Kriterien entspricht, da wir die Klausel mit der obigen Lösung erst gar nicht eingeben.
Sie können diesen Code ausprobieren, um HTTP-Statuscode von WebException abzurufen. Es funktioniert auch in Silverlight, da in SL WebExceptionStatus.ProtocolError nicht definiert ist.
HttpStatusCode GetHttpStatusCode(WebException we)
{
if (we.Response is HttpWebResponse)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
return response.StatusCode;
}
return null;
}
return 0
? oder besser HttpStatusCode?
( nullbar )?
var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}
Ich bin mir nicht sicher, ob es eine gibt, aber wenn es eine solche Eigenschaft gäbe, würde sie nicht als zuverlässig angesehen werden. A WebException
kann aus anderen Gründen als HTTP-Fehlercodes einschließlich einfacher Netzwerkfehler ausgelöst werden. Diese haben keinen solchen passenden http-Fehlercode.
Können Sie uns etwas mehr Informationen darüber geben, was Sie mit diesem Code erreichen möchten? Möglicherweise gibt es einen besseren Weg, um die benötigten Informationen zu erhalten.