Pergunta

Existe uma maneira fácil de obter o código de status HTTP de um System.Net.WebException?

Foi útil?

Solução

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

Outras dicas

Usando o operador condicional nulo (?.) 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 irá conter o HttpStatusCode. Quando há uma falha mais geral, como um erro de rede, onde nenhum código de status HTTP é enviado, então status será nulo. Nesse caso, você pode inspecionar ex.Status Para obter o WebExceptionStatus.

Se você deseja apenas uma sequência descritiva para registrar em caso de falha, você pode usar o operador de coalescação nula (??) 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 de 404, a string conterá "Notfound". Por outro lado, se o servidor estiver offline, a string conterá "ConnectFailure" e assim por diante.

(E para qualquer pessoa que queira saber como obter o código da subestação HTTP. Isso não é possível. É um conceito da Microsoft IIS que está conectado apenas ao servidor e nunca enviado ao cliente.)

Isso funciona apenas se a WebSponse for uma resposta httpwebra.

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

(Compreendo a pergunta é velha, mas é entre os top hits no Google.)

Uma situação comum onde você quer conhecer o código de resposta é no tratamento de exceção.Como C# 7, você pode usar a correspondência de padrões para, na verdade, apenas digite a pegar cláusula se a exceção corresponde 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, onde o WebException foi, na verdade, a exceção interna do outro (e nós estamos apenas interessados 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 re-lançar a exceção na captura cláusula quando ele não corresponde a seu critério, desde que não inserir a cláusula em primeiro lugar, com a solução acima.

Você pode tentar este código para obter o código de status HTTP da WebException. Funciona no Silverlight também 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;
}

Não tenho certeza se existe, mas se houvesse uma propriedade, não seria considerado confiável. UMA WebException Pode ser disparado por outros motivos que não os códigos de erro HTTP, incluindo erros de rede simples. Esses não têm esse código de erro HTTP correspondente.

Você pode nos dar um pouco mais de informações sobre o que está tentando realizar com esse código. Pode haver uma maneira melhor de obter as informações necessárias.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top