Frage

Gibt es einen einfachen Weg, um den HTTP-Statuscode von einem System.Net.WebException zu bekommen?

War es hilfreich?

Lösung

Vielleicht so etwas wie dies ...

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
    }
}

Andere Tipps

Durch die Verwendung von Null Konditionaloperator (?.) Sie können den HTTP-Statuscode mit einer einzigen Code-Zeile erhalten:

 HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;

Die Variable status enthält die HttpStatusCode . Wenn die gibt es eine allgemeinere Ausfall wie ein Netzwerkfehler in dem kein HTTP-Statuscode immer dann gesendet wird, status null sein. In diesem Fall können Sie ex.Status bekommen die null-koaleszierenden Operator (??) den entsprechenden Fehler erhalten:

string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
    ?? ex.Status.ToString();

Wenn die Ausnahme als Ergebnis eines 404 HTTP-Statuscode ausgelöst wird, wird die Zeichenfolge enthält „NotFound“. Auf der anderen Seite, wenn der Server offline die Zeichenfolge enthält „ConnectFailure“ und so weiter.

  

(Und für jeden, der wissen will, wie die HTTP erhalten Substatus   Code. Das ist nicht möglich. Es ist ein Microsoft IIS Konzept, das nur   angemeldet auf dem Server und nicht an den Client gesendet.)

Dies funktioniert nur, wenn WebResponse ein 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;
}

(Ich weiß, tun die Frage ist alt, aber es ist unter den Top-Hits auf Google.)

Eine gemeinsame Situation, wo Sie den Antwortcode wissen wollen, ist in Ausnahmebehandlung. Wie von C # 7 können Sie Pattern-Matching tatsächlich nutzen, um nur die catch-Klausel eingeben, wenn die Ausnahme Ihr Prädikat entspricht:

catch (WebException ex) when (ex.Response is HttpWebResponse response)
{
     doSomething(response.StatusCode)
}

Dies kann leicht auf weitere Ebenen ausgedehnt werden, wie in diesem Fall, in dem die WebException tatsächlich die innere Ausnahme eines anderen war (und wir sind nur in 404 interessiert):

catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)

Endlich:. Anmerkung, wie es gibt keine Notwendigkeit, erneut wirft die Ausnahme in der Klausel fangen, wenn es nicht Ihre Kriterien entspricht, da wir die Klausel in erster Linie mit der obigen Lösung nicht eingeben

Sie können versuchen, diesen Code zu erhalten HTTP-Statuscode von WebException. Es funktioniert in Silverlight auch weil SL nicht über WebExceptionStatus.ProtocolError definiert.

HttpStatusCode GetHttpStatusCode(WebException we)
{
    if (we.Response is HttpWebResponse)
    {
        HttpWebResponse response = (HttpWebResponse)we.Response;
        return response.StatusCode;
    }
    return null;
}

Ich bin sicher nicht, wenn es aber, wenn es eine solche Eigenschaft war würde es nicht als zuverlässig angesehen werden. Ein WebException kann aus anderen Gründen als HTTP-Fehlercodes und einfacher Vernetzung Fehler ausgelöst werden. Die haben keine solche Anpassung http Fehlercode an.

Können Sie uns ein bisschen mehr Informationen über was Sie versuchen, mit diesem Code zu erreichen. Es kann eine bessere Möglichkeit, die Informationen, die Sie benötigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top