Respostas:
Talvez algo assim ...
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
}
}
Usando o operador nulo-condicional ( ?.
), você pode obter o código de status HTTP com uma única linha de código:
HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;
A variável status
conterá o HttpStatusCode
. Quando houver uma falha mais geral, como um erro de rede em que nenhum código de status HTTP seja enviado, status
será nulo. Nesse caso, você pode inspecionar ex.Status
para obter o WebExceptionStatus
.
Se você deseja apenas que uma string descritiva faça logon em caso de falha, use o operador coalescente-nulo ( ??
) para obter o erro relevante:
string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
?? ex.Status.ToString();
Se a exceção for lançada como resultado de um código de status HTTP 404, a sequência conterá "NotFound". Por outro lado, se o servidor estiver offline, a cadeia conterá "ConnectFailure" e assim por diante.
(E para quem quiser saber como obter o código de substatus HTTP. Isso não é possível. É um conceito do Microsoft IIS que é registrado apenas no servidor e nunca enviado ao cliente.)
?.
operador foi originalmente denominado operador de propagação nula ou operador condicional nulo durante a liberação da visualização. Mas o recarregador Atlassian emite um aviso para usar o operador de propagação nula em tais cenários. É bom saber que também é chamado de operador condicional nulo.
isso funciona apenas se o WebResponse for um 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;
}
(Sei que a pergunta é antiga, mas está entre os principais hits do Google.)
Uma situação comum em que você deseja saber o código de resposta está no tratamento de exceções. A partir do C # 7, você pode usar a correspondência de padrões para realmente inserir apenas a cláusula catch se a exceção corresponder ao seu predicado:
catch (WebException ex) when (ex.Response is HttpWebResponse response)
{
doSomething(response.StatusCode)
}
Isso pode ser facilmente estendido para outros níveis, como neste caso em que na WebException
verdade era a exceção interna de outro (e estamos interessados apenas em 404
):
catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)
Finalmente: observe como não há necessidade de lançar novamente a exceção na cláusula catch quando ela não corresponde aos seus critérios, pois não inserimos a cláusula em primeiro lugar com a solução acima.
Você pode tentar esse código para obter o código de status HTTP do WebException. Também funciona no Silverlight porque o SL não possui WebExceptionStatus.ProtocolError definido.
HttpStatusCode GetHttpStatusCode(WebException we)
{
if (we.Response is HttpWebResponse)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
return response.StatusCode;
}
return null;
}
return 0
? ou melhor HttpStatusCode?
( anulável )?
var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}
Não tenho certeza se existe, mas se houvesse essa propriedade, não seria considerada confiável. A WebException
pode ser acionada por outros motivos que não os códigos de erro HTTP, incluindo simples erros de rede. Aqueles não têm esse código de erro http correspondente.
Você pode nos dar um pouco mais de informações sobre o que você está tentando realizar com esse código. Pode haver uma maneira melhor de obter as informações necessárias.