Réponses:
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
}
}
En utilisant l' opérateur conditionnel nul ( ?.
), vous pouvez obtenir le code d'état HTTP avec une seule ligne de code:
HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;
La variable status
contiendra le HttpStatusCode
. Lorsqu'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 fichier WebExceptionStatus
.
Si vous souhaitez simplement qu'une chaîne descriptive se connecte en cas d'échec, vous pouvez utiliser l' opérateur de fusion nul ( ??
) pour obtenir l'erreur appropriée:
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". En revanche, si le serveur est hors ligne, la chaîne contiendra "ConnectFailure" et ainsi de suite.
(Et pour quiconque souhaite savoir comment obtenir le code de sous-état HTTP. Ce n'est pas possible. Il s'agit d'un concept Microsoft IIS qui n'est enregistré que sur le serveur et jamais envoyé au client.)
?.
opérateur était à l'origine nommé opérateur de propagation nul ou opérateur conditionnel nul lors de la version préliminaire. Mais le resharper Atlassian donne un avertissement pour utiliser l'opérateur de propagation nul dans de tels scénarios. Bon à savoir qu'il est également appelé opérateur conditionnel nul.
cela ne fonctionne que si WebResponse est une 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 compte que la question est ancienne, mais elle fait partie des meilleurs résultats sur Google.)
Une situation courante dans laquelle vous souhaitez connaître le code de réponse est la gestion des exceptions. À partir de C # 7, vous pouvez utiliser la correspondance de modèles pour n'entrer dans 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ù le WebException
était en fait 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 relancer l'exception dans la clause catch lorsqu'elle ne correspond pas à vos critères, puisque nous n'entrons pas la clause en premier lieu avec la solution ci-dessus.
Vous pouvez essayer ce code pour obtenir le code d'état HTTP à partir de WebException. Cela fonctionne également dans Silverlight car SL n'a pas défini WebExceptionStatus.ProtocolError.
HttpStatusCode GetHttpStatusCode(WebException we)
{
if (we.Response is HttpWebResponse)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
return response.StatusCode;
}
return null;
}
return 0
? ou mieux HttpStatusCode?
( nullable )?
var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}
Je ne sais pas s'il y en a, mais s'il y avait une telle propriété, elle ne serait pas considérée comme fiable. A WebException
peut être déclenché pour des raisons autres que les codes d'erreur HTTP, y compris de simples erreurs de réseau. Ceux-ci n'ont pas de 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.