Các hướng dẫn dứt khoát để xử lý lỗi tùy chỉnh trong ASP.NET MVC 3 là gì?


44

Quá trình thực hiện xử lý lỗi tùy chỉnh trong ASP.NET MVC (3 trong trường hợp này) dường như bị bỏ quên vô cùng. Tôi đã đọc qua các câu hỏi và câu trả lời khác nhau ở đây, trên web, các trang trợ giúp cho các công cụ khác nhau (như Elmah), nhưng tôi cảm thấy như mình đã đi vào một vòng tròn hoàn chỉnh và vẫn không có giải pháp tốt nhất. Với sự giúp đỡ của bạn, có lẽ chúng tôi có thể thiết lập một cách tiếp cận tiêu chuẩn mới để xử lý lỗi. Tôi muốn giữ mọi thứ đơn giản và không quá kỹ sư này.

Đây là mục tiêu của tôi:

Đối với lỗi / ngoại lệ của Máy chủ:

  1. Hiển thị thông tin gỡ lỗi trong dev
  2. Hiển thị trang lỗi thân thiện trong sản xuất
  3. Đăng nhập lỗi và gửi email cho quản trị viên trong sản xuất
  4. Trả lại 500 Mã trạng thái HTTP

Đối với 404 Không tìm thấy lỗi:

  1. Hiển thị trang lỗi thân thiện
  2. Đăng nhập lỗi và gửi email cho quản trị viên trong sản xuất
  3. Trả về 404 Mã trạng thái HTTP

Có cách nào để đáp ứng những mục tiêu này với ASP.NET MVC không?


2
Tôi muốn câu hỏi này được di chuyển TRỞ LẠI sang SO để nó có thể nhận được nhiều câu trả lời hơn. Tôi đang tìm kiếm câu trả lời được mã hóa.
Shawn Mclean

@Shawn Điều đó khó có thể xảy ra. Câu hỏi liên quan đến chủ đề ở đây nhiều hơn là về SO và nó có câu trả lời được chấp nhận. Các câu hỏi thường không được di chuyển lại vì lý do kỹ thuật. Nếu bạn cần trợ giúp về mã hóa một phương pháp xử lý lỗi cụ thể, vui lòng mở một câu hỏi mới trên StackOverflow. Mặt khác, "câu trả lời được mã hóa" có thể là một tiêu chí quá rộng để trở nên hữu ích hoặc có thể trả lời được. Cuối cùng nhưng không kém phần quan trọng, cách tốt nhất để thu hút sự chú ý của người điều hành vào một câu hỏi là gắn cờ nó. Nhận xét của bạn ở đây có thể sẽ không được chú ý nếu nó không vấp cờ tự động bằng cách đẩy số bình luận lên 20.
Adam Lear

Đã từng có khoảng 10 bình luận ở đây, tất cả họ sẽ đi đâu?
RyanW

Tôi tìm thấy một giải pháp đáp ứng mục tiêu của bạn. Tôi có câu trả lời khác trên SO: stackoverflow.com/questions/6508415/ Kẻ
Jesse Webb

1
@AnnaLear Tôi đồng tình với Shawn. Tôi chỉ tìm thấy trang này thông qua Google. Lưu ý rằng gần như tất cả các câu trả lời dưới đây có chứa các liên kết BACK đến Stack Overflow. Đối với tôi mà nói nhiều, trong đó nó nên được để lại ở đó ở nơi đầu tiên.
Rebecca

Câu trả lời:


23

Tôi sẽ chia sẻ cách tôi kết thúc việc này, đó là một phần của câu hỏi ban đầu.

Đầu tiên, những vấn đề tôi gặp phải:

  1. Với customErrors trên (nghĩa là trong sản xuất), HandleErrorthuộc tính toàn cầu nuốt các ngoại lệ và hiển thị chế độ xem lỗi của bạn, nhưng sau đó bạn không thể đăng nhập nó bằng một công cụ addon như elmah, vì elmah không bao giờ nhìn thấy nó. Bạn có thể đăng nhập nó trong chế độ xem của bạn Tôi cho rằng, nhưng đó là một quan điểm, điều đó có vẻ sai. Thuộc tính HandleError toàn cầu xuất hiện mới trong mẫu dự án MVC 3 RTM Visual Studio.

  2. customErrors với các url cho điểm cuối MVC trả về 302 mã trạng thái. Có thuộc tính redirectmode, nhưng bạn không thể khớp các url mvc trong customErrors và sử dụng chế độ FeedbackRewrite. ( https://stackoverflow.com/questions/781861/customerrors-does-not-work-when-setting-redirectmode-responserewrite/3770265#3770265 )

  3. Tránh hoàn toàn tùy chỉnh Gương và xử lý mọi thứ tùy chỉnh trong ứng dụng của bạn dẫn đến rất nhiều sự phức tạp, IMO. (Iloved this: https://stackoverflow.com/questions/619895/how-can-i-properly-handle-404s-in-asp-net-mvc/2577095#2577095 , nhưng nó không phù hợp với dự án của chúng tôi)

Giải pháp của tôi

Tôi đã đưa MVC ra khỏi phương trình hoàn toàn. Tôi đã xóa HandleErrorAttributebộ lọc toàn cầu trong global.asax và tập trung hoàn toàn vào cấu hình customErrors, chuyển nó sang sử dụng chuyển hướng WebForm và thay đổi để chuyển hướng sang ResponseRewriteđể tránh mã phản hồi 302 HTTP.

<customErrors mode="On" defaultRedirect="/Error.aspx" redirectMode="ResponseRewrite">
  <error statusCode="404" redirect="/NotFound.aspx" />
</customErrors>

Sau đó, trong NotFound.aspxsự kiện page_load, đặt thành Response.StatusCode404 và trong Error.aspx đặt mã 500.

Các kết quả:

Các mục tiêu cho cả hai đã đạt được với nhật ký Elmah, trang lỗi thân thiện và mã trạng thái với một dòng mã ở phía sau mã. Chúng tôi sẽ không thực hiện theo "Cách thức MVC" như giải pháp trước đây, nhưng tôi đồng ý với điều đó nếu đó là hai dòng mã.


5

Tôi nghĩ rằng MVC, ASP và khung xử lý ghi nhật ký / ngoại lệ yêu thích của bạn có thể xử lý các mục tiêu của bạn khá độc đáo. ELMAH và Thư viện doanh nghiệp đều cung cấp dễ dàng sử dụng xử lý ngoại lệ và ghi nhật ký, vì vậy hãy chọn mục yêu thích của bạn .. Tôi sẽ không đi vào ưu và nhược điểm của từng loại ở đây.

LƯU Ý: bạn không thể hiển thị trang lỗi thân thiện VÀ trả lại HTTP 404 hoặc 500 như câu hỏi của bạn gợi ý. Khi bạn trả lại trang lỗi thân thiện, mã HTTP được trả về trình duyệt của bạn sẽ là 302. Đây là chuyển hướng đến trang lỗi thân thiện.

Trang lỗi thân thiện

Có vẻ như bạn có thể đạt được mục tiêu của mình bằng các cài đặt web.config thời trang tốt đã từng là một phần của ASP.net. Bạn đề cập đến việc hiển thị thông tin gỡ lỗi khi trong dev và hiển thị các trang thân thiện trong sản xuất. Bạn có thể sử dụng phần lỗi tùy chỉnh của web.config cho việc này (Đặt CustomErrors = "Tắt" để hiển thị thông tin gỡ lỗi). Tôi sẽ giả định rằng bạn quen thuộc với thuộc tính CustomErrors, nếu không đọc điều này:

http://msdn.microsoft.com/en-us/l Library / h0hfz6fc.aspx

Nếu bạn cần mức độ chi tiết cao hơn của quyền kiểm soát đối với các chế độ xem lỗi mà bạn hiển thị, thì hãy sử dụng Thuộc tính Xử lýError của MVC. Bằng cách này, bạn có thể chọn các chế độ xem lỗi khác nhau cho mỗi Hành động / Trình điều khiển.

http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx

Ghi nhật ký ngoại lệ

Có vẻ như bạn muốn phản hồi tất cả các trường hợp ngoại lệ của mình theo cùng một cách ('Đăng nhập lỗi và gửi email cho quản trị viên trong sản xuất'). Nếu đây là trường hợp, tùy chọn đơn giản nhất của bạn là thêm mã vào

Application_Error (người gửi đối tượng, EventArss e)

trong global.asax của bạn. Đây là nơi bạn có thể chuyển qua khung đăng nhập đã chọn.

Nếu bạn muốn kiểm soát nhiều hơn đối với việc ghi / xử lý ngoại lệ của mình thì bạn có thể phân lớp Xử lýErrorAttribution và ghi đè

OnException(System.Web.Mvc.ExceptionContext filterContext)

đây là một nơi khác mà bạn có thể chuyển qua khung đăng nhập đã chọn.

https://stackoverflow.com/questions/183316/asp-net-mvc-handleerror

Điều này cho phép bạn kiểm soát nhiều hơn kỹ thuật Application_Error đã đề cập ở trên.

Nói chung, MVC cung cấp cho bạn mức độ chi tiết cao về cách kiểm soát lỗi. Nếu bạn không cần điều khiển này thì bạn có thể quay lại các cách thực hiện của ASP.net như xác định các trang lỗi trên web.config.


Cảm ơn rất nhiều vì đã thêm suy nghĩ của bạn. Tôi nghĩ rằng mã trạng thái 302 là sự lựa chọn thiết kế kém của nhóm ASP.NET gốc. Tôi cũng sẽ nhận được câu trả lời đó, có một số lựa chọn để làm điều đó. Có vẻ như một số người trong thế giới MVC đang từ bỏ hoàn toàn customErrors và xử lý tất cả trong ứng dụng để có thể sử dụng lại tốt hơn và kiểm soát nhiều hơn khi bạn chỉ ra. Nhưng, tôi đã hạn chế thành công trong việc thực hiện những điều đó và đã thêm rất nhiều mã có vẻ như nó được nướng tốt hơn. Thêm trong câu trả lời của tôi dưới đây.

Tôi thích ghi đè phương thức OnException để ghi nhật ký, theo cách này tôi biết tôi có thể ghi nhật ký mọi thứ, thậm chí xảy ra lỗi từ một cuộc gọi Ajax mà tôi tìm thấy sẽ không kích hoạt Application_Error của bạn.
Alicia

@Alicia mã mẫu đầy đủ?
Kiquenet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.