5

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à:

  1. cách đúng đắn của dịch AnException vào HTTP 404 phản ứng là gì?
  2. Phần customErrors hoạt động như thế nào khi xử lý ngoại lệ trong Application_Error?
  3. Tại sao lại ném trang HttpException (404) ám (trống) thành công (200)?

Xin cảm ơn,
Dmitriy.

Trả lời

2

Trong một vài từ, bạn nếu bạn đặt trạng thái HTTP theo cách thủ công trong Application_Error, bạn sẽ mất khả năng sử dụng trình xử lý phần tùy chỉnh, vì bạn gọi Server.ClearError().

Xử lý ngoại lệ trước khi Application_Error hoặc lấy ngoại lệ từ HttpException.

  • Cách thích hợp để dịch AnException thành phản hồi HTTP 404 là gì?

Tốt hơn là xử lý ngoại lệ trong Bộ điều khiển. Bạn có thể giới thiệu bộ điều khiển lớp cơ sở và xử lý hầu hết các ngoại lệ trong thuộc tính HandleError tùy chỉnh. Bạn có thể ném HttpException của họ và nó sẽ được xử lý đúng bởi bộ xử lý phần customErrors.

Bạn cũng có thể lấy được ngoại lệ ObjectNotFoundException của bạn từ HttpException (404)

Application_Error là cơ hội cuối cùng để xử lý một ngoại lệ. Bạn chỉ có API phản hồi để xử lý nó. Bạn có thể tự thiết lập mã trạng thái và viết để trả lời hoặc tự kích hoạt chuyển hướng đến trang lỗi tùy chỉnh hoặc gọi Server.TransferRequest() tới tệp html hoặc aspx hiện có (không phải hành động của bộ điều khiển). Trong phiên bản asp.net hiện tại, bạn không thể đặt hoặc thay đổi Server.GetLastError trong phương thức Application_Error chỉ lấy hoặc xóa nó.

  • Phần CustomErrors hoạt động như thế nào khi xử lý ngoại lệ trong Application_Error?

Bằng cách gọi Máy chủ.ClearError(), bạn cũng sạch lỗi yêu cầu hiện tại do đó nó không được xử lý bởi phần customErrors handler

  • Tại sao ném HttpException (404) làm cho (trống) trang với thành công (200) trạng thái?

Bạn không nên ném bất kỳ ngoại lệ nào trong phương thức Application_Error. Ngoại lệ có nghĩa là việc xử lý lỗi của bạn không thành công.

+0

'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. –

+0

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 –

+0

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'. –

Các vấn đề liên quan