Trả lời nhanh / TL; DR
Dành cho những người lười biếng ngoài kia:
Install-Package MagicalUnicornMvcErrorToolkit -Version 1.0
Sau đó xóa dòng này khỏi global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
Và điều này chỉ dành cho IIS7 + và IIS Express.
Nếu bạn đang sử dụng Cassini .. tốt .. um .. er .. vụng về ...
Long, giải thích câu trả lời
Tôi biết điều này đã được trả lời. Nhưng câu trả lời là THỰC SỰ ĐƠN GIẢN (chúc mừng David Fowler và Damian Edwards vì đã thực sự trả lời điều này).
Có cần phải làm bất cứ điều gì tùy chỉnh .
Dành cho ASP.NET MVC3
, tất cả các bit và miếng ở đó.
Bước 1 -> Cập nhật web.config của bạn trong HAI điểm.
<system.web>
<customErrors mode="On" defaultRedirect="/ServerError">
<error statusCode="404" redirect="/NotFound" />
</customErrors>
và
<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" path="/NotFound" responseMode="ExecuteURL" />
<remove statusCode="500" subStatusCode="-1" />
<error statusCode="500" path="/ServerError" responseMode="ExecuteURL" />
</httpErrors>
...
<system.webServer>
...
</system.web>
Bây giờ hãy lưu ý cẩn thận về ROUTES tôi đã quyết định sử dụng. Bạn có thể sử dụng bất cứ thứ gì, nhưng các tuyến đường của tôi là
/NotFound
<- đối với 404 không tìm thấy, trang lỗi.
/ServerError
<- đối với bất kỳ lỗi nào khác, bao gồm các lỗi xảy ra trong mã của tôi. đây là lỗi 500 máy chủ nội bộ
Xem làm thế nào phần đầu tiên <system.web>
chỉ có một mục tùy chỉnh? Các statusCode="404"
mục? Tôi chỉ liệt kê một mã trạng thái vì tất cả các lỗi khác, bao gồm 500 Server Error
(ví dụ: những lỗi đáng tiếc đó xảy ra khi mã của bạn có lỗi và làm hỏng yêu cầu của người dùng) .. tất cả các lỗi khác được xử lý bởi cài đặt defaultRedirect="/ServerError"
.. có nói , nếu bạn không tìm thấy trang 404, thì vui lòng xem tuyến đường/ServerError
.
Đồng ý. đó là ngoài đường .. bây giờ đến các tuyến đường của tôi được liệt kê trongglobal.asax
Bước 2 - Tạo các tuyến đường trong Global.asax
Đây là phần lộ trình đầy đủ của tôi ..
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{*favicon}", new {favicon = @"(.*/)?favicon.ico(/.*)?"});
routes.MapRoute(
"Error - 404",
"NotFound",
new { controller = "Error", action = "NotFound" }
);
routes.MapRoute(
"Error - 500",
"ServerError",
new { controller = "Error", action = "ServerError"}
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {controller = "Home", action = "Index", id = UrlParameter.Optional}
);
}
Trong đó liệt kê hai tuyến bỏ qua -> axd's
và favicons
(ooo! Phần thưởng bỏ qua tuyến đường, dành cho bạn!) Sau đó (và thứ tự là MỆNH LỆNH TẠI ĐÂY), tôi có hai tuyến xử lý lỗi rõ ràng của mình .. tiếp theo là bất kỳ tuyến nào khác. Trong trường hợp này, một mặc định. Tất nhiên, tôi có nhiều hơn, nhưng đó là đặc biệt cho trang web của tôi. Chỉ cần đảm bảo các tuyến lỗi nằm ở đầu danh sách. Trật tự là bắt buộc .
Cuối cùng, trong khi chúng tôi ở trong global.asax
tệp của mình, chúng tôi KHÔNG đăng ký toàn cầu thuộc tính HandleError. Không, không, không thưa ngài. Nadda. Không. Niên. Tiêu cực. Không ...
Xóa dòng này khỏi global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
Bước 3 - Tạo bộ điều khiển với các phương thức hành động
Bây giờ .. chúng tôi thêm một bộ điều khiển với hai phương thức hành động ...
public class ErrorController : Controller
{
public ActionResult NotFound()
{
Response.StatusCode = (int)HttpStatusCode.NotFound;
return View();
}
public ActionResult ServerError()
{
Response.StatusCode = (int)HttpStatusCode.InternalServerError;
// Todo: Pass the exception into the view model, which you can make.
// That's an exercise, dear reader, for -you-.
// In case u want to pass it to the view, if you're admin, etc.
// if (User.IsAdmin) // <-- I just made that up :) U get the idea...
// {
// var exception = Server.GetLastError();
// // etc..
// }
return View();
}
// Shhh .. secret test method .. ooOOooOooOOOooohhhhhhhh
public ActionResult ThrowError()
{
throw new NotImplementedException("Pew ^ Pew");
}
}
Ok, hãy kiểm tra cái này Trước hết, KHÔNG có [HandleError]
thuộc tính ở đây. Tại sao? Bởi vì được xây dựng trongASP.NET
sẵn đã xử lý lỗi VÀ chúng tôi đã chỉ định tất cả các shit chúng tôi cần làm để xử lý lỗi :) Đó là trong phương pháp này!
Tiếp theo, tôi có hai phương thức hành động. Không có gì khó khăn ở đó. Nếu bạn muốn hiển thị bất kỳ thông tin ngoại lệ nào, thì bạn có thể sử dụng Server.GetLastError()
để có được thông tin đó.
Phần thưởng WTF: Có, tôi đã thực hiện phương pháp hành động thứ ba, để kiểm tra xử lý lỗi.
Bước 4 - Tạo Chế độ xem
Và cuối cùng, tạo ra hai quan điểm. Đặt em vào vị trí xem bình thường, cho bộ điều khiển này.
Thưởng bình luận
- Bạn không cần một
Application_Error(object sender, EventArgs e)
- Các bước trên đều hoạt động hoàn hảo 100% với Elmah . Elmah làm phiền wroxs!
Và đó, các bạn của tôi, nên là nó.
Bây giờ, chúc mừng bạn đã đọc nhiều và có một Kỳ lân như một giải thưởng!