web-dev-qa-db-fra.com

System.Net.WebException Code de statut HTTP

Existe-t-il un moyen simple d’obtenir le code de statut HTTP à partir d’un fichier System.Net.WebException?

140
Gilsham

Peut-être quelque chose comme ça ...

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

En utilisant le opérateur null-conditionnel (?.) vous pouvez obtenir le code de statut HTTP avec une seule ligne de code:

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

La variable status contiendra le HttpStatusCode . Quand il y a un échec plus général comme une erreur réseau où aucun code d'état HTTP n'est jamais envoyé, alors status sera nul. Dans ce cas, vous pouvez inspecter ex.Status pour obtenir le WebExceptionStatus .

Si vous souhaitez simplement qu'une chaîne descriptive se connecte en cas d'échec, vous pouvez utiliser le opérateur null-coalescing (??) pour obtenir l'erreur pertinente:

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

Si l'exception est levée à la suite d'un code d'état HTTP 404, la chaîne contiendra "NotFound". D'autre part, si le serveur est hors ligne, la chaîne contiendra "ConnectFailure" et ainsi de suite.

(Et pour tous ceux qui veulent savoir comment obtenir le code de sous-état HTTP. Ce n’est pas possible. C’est un concept Microsoft IIS qui n’a été connecté qu’au serveur et n’a jamais été envoyé au client. )

23
Martin Liversage

cela ne fonctionne que si WebResponse est un HttpWebResponse.

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;
}
8
pr0gg3r

(Je me rends bien compte que la question est ancienne, mais elle figure parmi les plus grands succès sur Google.)

Une situation courante dans laquelle vous souhaitez connaître le code de réponse concerne la gestion des exceptions. À partir de C # 7, vous pouvez utiliser la correspondance de modèle pour ne saisir la clause catch que si l'exception correspond à votre prédicat:

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

Cela peut facilement être étendu à d'autres niveaux, comme dans ce cas où WebException était en réalité l'exception interne d'un autre (et nous ne sommes intéressés que par 404):

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

Enfin: notez qu'il n'est pas nécessaire de renvoyer l'exception dans la clause catch lorsqu'elle ne correspond pas à vos critères, car nous n'entrons pas la clause en premier lieu avec la solution ci-dessus.

6
miniyou

Vous pouvez essayer ce code pour obtenir le code de statut HTTP à partir de WebException. Cela fonctionne également dans Silverlight car SL ne définit pas WebExceptionStatus.ProtocolError.

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

Je ne sais pas si c'est le cas, mais s'il existait une telle propriété, elle ne serait pas considérée comme fiable. Un WebException peut être déclenché pour des raisons autres que les codes d'erreur HTTP, y compris les erreurs de réseau simples. Ceux-ci n'ont aucun code d'erreur http correspondant.

Pouvez-vous nous donner un peu plus d'informations sur ce que vous essayez d'accomplir avec ce code? Il existe peut-être un meilleur moyen d'obtenir les informations dont vous avez besoin.

1
JaredPar