Answers:
也许是这样的...
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
}
}
通过使用空条件运算符(?.
),您可以使用单行代码获取HTTP状态代码:
HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;
该变量status
将包含HttpStatusCode
。当出现更常见的故障(例如网络错误)时,如果从未发送过HTTP状态代码,则status
它将为null。在这种情况下,您可以检查ex.Status
以获取WebExceptionStatus
。
如果您只想在发生故障时记录描述性字符串,则可以使用null运算符(??
)来获取相关的错误:
string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
?? ex.Status.ToString();
如果由于404 HTTP状态代码而引发异常,则该字符串将包含“ NotFound”。另一方面,如果服务器处于脱机状态,则该字符串将包含“ ConnectFailure”,依此类推。
(对于任何想知道如何获取HTTP子状态代码的人。这都是不可能的。这是一个Microsoft IIS概念,仅在服务器上登录,而从未发送给客户端。)
?.
在预览发布期间该运算符最初是被命名为null传播运算符还是null条件运算符。但是Atlassian reshaper会警告在这种情况下使用空传播算子。很高兴知道它也称为空条件运算符。
仅在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;
}
(我确实知道这个问题很老,但这是Google上的热门歌曲之一。)
您想知道响应代码的常见情况是异常处理。从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子句中重新引发该异常,因为我们没有使用上述解决方案首先输入该子句。
您可以尝试使用此代码从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;
}
return 0
?或更好HttpStatusCode?
(可为null)?
var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}