Câu trả lời:
Có lẽ một cái gì đó như thế này ...
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
}
}
Bằng cách sử dụng toán tử có điều kiện null ( ?.
), bạn có thể nhận được mã trạng thái HTTP với một dòng mã:
HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;
Biến status
sẽ chứa HttpStatusCode
. Khi có một lỗi chung hơn như lỗi mạng trong đó không có mã trạng thái HTTP nào được gửi thì status
sẽ không có giá trị. Trong trường hợp đó bạn có thể kiểm tra ex.Status
để có được WebExceptionStatus
.
Nếu bạn chỉ muốn một chuỗi mô tả đăng nhập trong trường hợp thất bại, bạn có thể sử dụng toán tử hợp nhất null ( ??
) để nhận lỗi liên quan:
string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
?? ex.Status.ToString();
Nếu ngoại lệ được ném do kết quả của mã trạng thái HTTP HTTP, chuỗi sẽ chứa "NotFound". Mặt khác, nếu máy chủ ngoại tuyến, chuỗi sẽ chứa "ConnectFailure", v.v.
(Và đối với bất kỳ ai muốn biết cách lấy mã thế hệ HTTP. Điều đó là không thể. Đây là một khái niệm Microsoft IIS chỉ được ghi lại trên máy chủ và không bao giờ được gửi cho khách hàng.)
?.
toán tử ban đầu được đặt tên là toán tử lan truyền null hoặc toán tử có điều kiện null trong khi phát hành bản xem trước. Nhưng chia sẻ lại Atlassian đưa ra một cảnh báo để sử dụng toán tử lan truyền null trong các tình huống như vậy. Rất vui khi biết rằng nó cũng được gọi là toán tử có điều kiện null.
điều này chỉ hoạt động nếu WebResponse là một 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;
}
(Tôi nhận ra câu hỏi đã cũ, nhưng đây là một trong những lượt truy cập hàng đầu trên Google.)
Một tình huống phổ biến mà bạn muốn biết mã phản hồi là xử lý ngoại lệ. Kể từ C # 7, bạn có thể sử dụng khớp mẫu để thực sự chỉ nhập mệnh đề bắt nếu ngoại lệ khớp với vị từ của bạn:
catch (WebException ex) when (ex.Response is HttpWebResponse response)
{
doSomething(response.StatusCode)
}
Điều này có thể dễ dàng được mở rộng đến các cấp độ khác, chẳng hạn như trong trường hợp WebException
này thực sự là ngoại lệ bên trong của một cấp độ khác (và chúng tôi chỉ quan tâm đến 404
):
catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)
Cuối cùng: lưu ý làm thế nào không cần phải ném lại ngoại lệ trong mệnh đề bắt khi nó không phù hợp với tiêu chí của bạn, vì chúng tôi không nhập mệnh đề ở vị trí đầu tiên với giải pháp trên.
Bạn có thể thử mã này để lấy mã trạng thái HTTP từ WebException. Nó cũng hoạt động trong Silverlight vì SL không có WebExceptionStatus.ProtocolError được xác định.
HttpStatusCode GetHttpStatusCode(WebException we)
{
if (we.Response is HttpWebResponse)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
return response.StatusCode;
}
return null;
}
return 0
? hoặc tốt hơn HttpStatusCode?
( nullable )?
var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}
Tôi không chắc có nếu có nhưng nếu có một tài sản như vậy thì nó sẽ không được coi là đáng tin cậy. A WebException
có thể bị loại vì các lý do khác với mã lỗi HTTP bao gồm các lỗi mạng đơn giản. Những người không có mã lỗi http phù hợp như vậy.
Bạn có thể cho chúng tôi thêm một chút thông tin về những gì bạn đang cố gắng thực hiện với mã đó không. Có thể có một cách tốt hơn để có được thông tin bạn cần.