Trước hết, nhanh chóng chính xác những gì tôi muốn đạt được: dịch ngoại lệ cụ thể vào HTTP 404 để ASP.NET có thể xử lý thêm.Chuyển đổi ngoại lệ thành phản hồi HTTP 404 trong Application_Error
Tôi đang xử lý ngoại lệ trong ASP.NET (MVC2) theo cách này:
protected void Application_Error(object sender, EventArgs e) {
var err = Server.GetLastError();
if (err == null)
return;
err = err.GetBaseException();
var noObject = err as ObjectNotFoundException;
if (noObject != null)
HandleObjectNotFound();
var handled = noObject != null;
if (!handled)
Logger.Fatal("Unhandled exception has occured in application.", err);
}
private void HandleObjectNotFound() {
Server.ClearError();
Response.Clear();
// new HttpExcepton(404, "Not Found"); // Throw or not to throw?
Response.StatusCode = 404;
Response.StatusDescription = "Not Found";
Response.StatusDescription = "Not Found";
Response.Write("The whole HTML body explaining whata 404 is??");
}
Vấn đề là tôi không thể cấu hình mặc định customErrors
để làm việc với nó. Khi đó là on
thì nó không bao giờ chuyển hướng đến trang được chỉ định trong customErrors
: <error statusCode="404" redirect="404.html"/>
.
Tôi cũng đã cố gắng tăng new HttpExcepton(404, "Not Found")
từ trình xử lý nhưng sau đó mã phản hồi là 200
mà tôi không hiểu tại sao.
Vì vậy, câu hỏi là:
- cách đúng đắn của dịch
AnException
vào HTTP404
phản ứng là gì? - Phần
customErrors
hoạt động như thế nào khi xử lý ngoại lệ trong Application_Error? - Tại sao lại ném trang HttpException (404) ám (trống) thành công (200)?
Xin cảm ơn,
Dmitriy.
'Tốt hơn là xử lý các ngoại lệ trong Controller' - có thể, nhưng nó sẽ không bắt ngoại lệ Non-Mvc, mà tôi cần. 'lấy được ngoại lệ ObjectNotFoundException của bạn từ HttpException' - không thể, nó là ngoại lệ từ lớp Dữ liệu và không liên quan gì đến HTTP. 'Bạn có thể đặt mã trạng thái theo cách thủ công và ghi thành phản hồi' - trong trường hợp này, cấu hình' customErrors' sẽ không được khởi động. 'chuyển hướng thủ công tới trang lỗi tùy chỉnh' - tại sao trong địa ngục thì chúng ta có '* tùy chỉnh * Phần lỗi. Một điều đơn giản như vậy, nhưng rất nhiều trở ngại, - chỉ cần kick-in handler customError về ngoại lệ nhất định. –
Dmitriy, tôi đồng ý với bạn rằng nó sẽ là tốt để thay đổi Server.GetLastError trong Application_Error. Nhưng ASP.Net API hiện tại không cho phép làm điều đó. "nhưng nó sẽ không bắt ngoại lệ Non-Mvc, mà tôi cần." - Bạn có thể bắt tất cả các ngoại lệ trên mức bộ điều khiển bằng cách sử dụng thuộc tính HandleError chuẩn hoặc triển khai thực hiện. Cố gắng tránh ném ngoại lệ trong khi hiển thị chế độ xem. Nếu bạn nhận được ngoại lệ trong khi hiển thị chế độ xem, có thể bài viết này có thể hữu ích cho bạn: http://stackoverflow.com/questions/1074540/how-to-catch-exception-of-mvc-view –
Andrej, I không thể bắt tất cả các ngoại lệ trên cấp độ bộ điều khiển vì có các trang WebForms thông thường như các phần không phải MVC khác trong ứng dụng, do đó, một nơi duy nhất để xử lý tất cả các lỗi là đối tượng ứng dụng toàn cầu. Đó là tốt, tôi chỉ không thể tìm ra cách "trả lại" 404 từ đó, để nó sẽ được xử lý bởi 'customErrors'. –