Швидкий відповідь / TL; DR
Для ледачих людей там:
Install-Package MagicalUnicornMvcErrorToolkit -Version 1.0
Потім видаліть цей рядок із global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
І це лише для IIS7 + та IIS Express.
Якщо ви використовуєте Кассіні ... ну .. гм ... е .. незручно ...
Довга, пояснена відповідь
Я знаю, на це відповіли. Але відповідь дійсно ПРОСТО (ура) Девіда Фаулера та Даміана Едвардса за те, що дійсно відповідають на це).
існує потрібно нічого робити на замовлення .
Бо ASP.NET MVC3
всі шматочки та шматки є там.
Крок 1 -> Оновіть web.config у двох місцях.
<system.web>
<customErrors mode="On" defaultRedirect="/ServerError">
<error statusCode="404" redirect="/NotFound" />
</customErrors>
і
<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>
Тепер уважно зверніть увагу на маршрути, які я вирішив використовувати. Можна використовувати що завгодно, але мої маршрути є
/NotFound
<- для сторінки 404 не знайдено, помилка.
/ServerError
<- для будь-якої іншої помилки включайте помилки, які трапляються в моєму коді. це 500 внутрішніх помилок сервера
Подивіться, як перший розділ <system.web>
містить лише один спеціальний запис? statusCode="404"
Запис? Я перерахував лише один код статусу, тому що всі інші помилки, включаючи 500 Server Error
(тобто ті примхливі помилки, які трапляються, коли у вашому коді є помилка та збої в запиті користувача) .. всі інші помилки обробляються налаштуваннями defaultRedirect="/ServerError"
.. що говорить , якщо ви не знайшли сторінку 404, тоді перейдіть на маршрут /ServerError
.
Добре. це не в дорозі .. тепер до моїх маршрутів, перелічених уglobal.asax
Крок 2 - Створення маршрутів у Global.asax
Ось мій повний розділ маршруту ..
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}
);
}
Тут перераховано два маршрути ігнорування -> axd's
та favicons
(ooo! Bonus bonus ignore route, для вас!) Тоді (і замовлення ІМПЕРАТИВНЕ ТУТ), у мене є два явні маршрути щодо обробки помилок. Далі слід будь-які інші маршрути. У цьому випадку за замовчуванням. Звичайно, у мене є більше, але це особливо для мого веб-сайту. Просто переконайтеся, що маршрути помилок знаходяться вгорі списку. Порядок обов'язковий .
Нарешті, перебуваючи всередині нашого global.asax
файлу, ми НЕ глобально реєструємо атрибут HandleError. Ні, ні, ні пане. Надя. Ні. Нієн. Негативний. Noooooooooo ...
Видаліть цей рядок із global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
Крок 3 - Створіть контролер методами дій
Тепер .. ми додаємо контролер з двома способами дій ...
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");
}
}
Гаразд, давайте перевірити це. Перш за все, тут немає [HandleError]
атрибута NO . Чому? Тому що вбудованийASP.NET
рамка вже обробляє помилки І ми вказали все лайно, яке нам потрібно зробити, щоб впоратися з помилкою :) Це в цьому методі!
Далі я маю два способи дії. Нічого жорсткого там немає. Якщо ви хочете показати будь-яку інформацію про виключення, тоді ви можете скористатись Server.GetLastError()
цією інформацією.
Бонус WTF: Так, я застосував третій метод дій, щоб перевірити обробку помилок.
Крок 4 - Створіть подання
І нарешті, створіть два погляди. Помістіть em у звичайне місце для цього контролера.
Бонусні коментарі
- Вам не потрібен
Application_Error(object sender, EventArgs e)
- Наведені вище кроки всі працюють на 100% ідеально з Elmah . Elmah розбиваючи ангели!
І це, друзі, повинно бути так.
Тепер, привітання, щоб прочитати це багато і мати Єдиноріг як приз!