Question

Y at-il un moyen facile d'obtenir le code d'état HTTP d'un System.Net.WebException?

Était-ce utile?

La solution

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

Autres conseils

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

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

La status variable contiendra le HttpStatusCode . Lorsque le il y a un échec plus général comme une erreur de réseau où aucun code d'état HTTP est envoyé alors jamais status sera nulle. Dans ce cas, vous pouvez inspecter ex.Status pour obtenir le opérateur null-coalescent (??) pour obtenir l'erreur correspondant:

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 quelqu'un qui veut savoir comment obtenir le substatus HTTP   code. Ce n'est pas possible. Il est un concept Microsoft IIS qui est seulement   connecté sur le serveur et jamais envoyé au client.)

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

(je me rends bien compte de la question est vieux, mais il est parmi les hits sur Google.)

Une situation commune où vous voulez connaître le code de réponse est dans la gestion des exceptions. A partir de C # 7, vous pouvez utiliser pattern matching pour entrer effectivement que la clause catch si l'exception correspond à votre prédicat:

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

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

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

Enfin: notez comment il n'y a pas besoin de re-jeter l'exception dans la clause catch quand il ne correspond pas à vos critères, étant donné que nous ne prenons pas la clause en premier lieu avec la solution ci-dessus

.

Vous pouvez essayer ce code pour obtenir le code d'état HTTP de WebException. Il fonctionne aussi parce que Silverlight SL ne dispose pas WebExceptionStatus.ProtocolError défini.

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

Je ne sais pas s'il y a, mais il y avait un tel bien il ne serait pas considéré comme fiable. Un WebException peut être congédié pour des raisons autres que les codes d'erreur HTTP, y compris de simples erreurs de mise en réseau. Ceux-ci ont aucune correspondance le code d'erreur HTTP.

Pouvez-vous nous donner un peu plus d'informations sur ce que vous essayez d'accomplir avec ce code. Il peut y avoir une meilleure façon d'obtenir les informations dont vous avez besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top