有没有一种简单的方法可以从System.Net.WebException中获取HTTP状态代码
发布于 2010-09-01 08:04:18
也许就像这样..。
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
}
}发布于 2017-01-17 21:31:55
通过使用null-conditional operator (?.),您可以通过一行代码获得HTTP状态代码:
HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;变量status将包含HttpStatusCode。如果出现更常见的故障,如网络错误,没有发送任何HTTP状态代码,则status将为null。在这种情况下,您可以检查ex.Status以获取WebExceptionStatus。
如果您只需要一个描述性字符串在失败的情况下记录,您可以使用null-coalescing operator (??)来获取相关错误:
string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
?? ex.Status.ToString();如果异常是作为404HTTP状态代码的结果抛出的,则字符串将包含"NotFound“。另一方面,如果服务器离线,字符串将包含"ConnectFailure“,依此类推。
(对于任何想知道如何获得HTTP子状态代码的人来说。这是不可能的。它是一个Microsoft IIS概念,只在服务器上登录,而不会发送到客户端。)
发布于 2017-10-18 20:55:59
(我确实意识到这个问题很古老,但它是谷歌上最热门的问题之一。)
您想知道响应代码的常见情况是在异常处理中。在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子句中重新抛出异常,因为我们没有在上面的解决方案中首先输入该子句。
https://stackoverflow.com/questions/3614034
复制相似问题