是否有一种简单的方法可以从System.Net.WebException
获取HTTP状态代码?
答案 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错误代码。
您能否向我们提供有关您尝试使用该代码完成的更多信息。可能有更好的方法来获取所需的信息。