System.Net.WebException HTTP状态代码

时间:2010-08-31 23:49:36

标签: c# http-status-codes webexception

是否有一种简单的方法可以从System.Net.WebException获取HTTP状态代码?

6 个答案:

答案 0 :(得分:222)

也许是这样的......

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

答案 1 :(得分:23)

使用null-conditional operator?.),您可以通过一行代码获取HTTP状态代码:

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

变量status将包含HttpStatusCode。当存在更普遍的故障,例如网络错误,其中没有发送HTTP状态代码时,status将为空。在这种情况下,您可以检查ex.Status以获取WebExceptionStatus

如果您只想在失败的情况下记录描述性字符串,可以使用null-coalescing operator??)来获取相关错误:

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

如果由于404 HTTP状态代码而抛出异常,则该字符串将包含" NotFound"。另一方面,如果服务器处于脱机状态,则字符串将包含" ConnectFailure"等等。

  

(对于任何想知道如何获取HTTP子状态的人   码。这是不可能的。它只是一个Microsoft IIS概念   登录服务器,从未发送到客户端。)

答案 2 :(得分:8)

仅当WebResponse是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;
}

答案 3 :(得分:6)

(我确实知道这个问题已经过时了,但它却是谷歌的热门话题之一。)

您希望了解响应代码的常见情况是异常处理。从C#7开始,如果异常与谓词匹配,您可以使用模式匹配实际上只输入catch子句:

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

这很容易扩展到更高级别,例如在这种情况下WebException实际上是另一个的内部例外(我们只对404感兴趣):

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

最后:注意当catch子句与你的标准不匹配时,如何不需要在catch子句中重新抛出异常,因为我们不会在上面的解决方案中首先输入该子句。

答案 4 :(得分:3)

您可以尝试使用此代码从WebException获取HTTP状态代码。它也适用于Silverlight,因为SL没有定义WebExceptionStatus.ProtocolError。

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

答案 5 :(得分:1)

我不确定是否有,但如果有这样的财产则不会被认为是可靠的。可能由于HTTP错误代码以外的原因而触发WebException,包括简单的网络错误。那些没有匹配的http错误代码。

您能否向我们提供有关您尝试使用该代码完成的更多信息。可能有更好的方法来获取所需的信息。