Я занимаюсь разработкой базового веб-сайта MVC3 и ищу решение для обработки ошибок и визуализации пользовательских представлений для каждого вида ошибок. Итак, представьте, что у меня есть контроллер «Ошибка», в котором его основное действие - «Индекс» (общая страница ошибок), и этот контроллер будет иметь еще пару действий для ошибок, которые могут отображаться пользователю, например «Handle500» или «HandleActionNotFound».
Поэтому любая ошибка, которая может произойти на веб-сайте, может обрабатываться этим контроллером «Ошибка» (примеры: «Контроллер» или «Действие» не найдены, 500, 404, dbException и т. Д.)
Я использую файл Sitemap для определения пути к сайту (а не маршрута).
На этот вопрос уже был дан ответ, это ответ Gweebz
Мой последний метод applicationaiton_error следующий:
protected void Application_Error() {
//while my project is running in debug mode
if (HttpContext.Current.IsDebuggingEnabled && WebConfigurationManager.AppSettings["EnableCustomErrorPage"].Equals("false"))
{
Log.Logger.Error("unhandled exception: ", Server.GetLastError());
}
else
{
try
{
var exception = Server.GetLastError();
Log.Logger.Error("unhandled exception: ", exception);
Response.Clear();
Server.ClearError();
var routeData = new RouteData();
routeData.Values["controller"] = "Errors";
routeData.Values["action"] = "General";
routeData.Values["exception"] = exception;
IController errorsController = new ErrorsController();
var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
errorsController.Execute(rc);
}
catch (Exception e)
{
//if Error controller failed for same reason, we will display static HTML error page
Log.Logger.Fatal("failed to display error page, fallback to HTML error: ", e);
Response.TransmitFile("~/error.html");
}
}
}
источник
Ответы:
Вот пример того, как я обрабатываю пользовательские ошибки. Я определяю
ErrorsController
действия с различными HTTP-ошибками:а затем я присоединяюсь к
Application_Error
вGlobal.asax
и вызвать этот контроллер:источник
Execute
это метод, определенный вIController
интерфейсе. Это не может быть защищено. Посмотрите на мой код более внимательно:IController errorsController = new ErrorsController();
обратите внимание на типerrorsController
переменной, для которой я вызываюExecute
метод. Это тип,IController
поэтому ничто не мешает вам вызывать этот метод. И, кстати,Execute
был защищен и в классе Controller в MVC 3, так что никаких изменений в этом отношении нет.Response.ContentType = "text/html";
Вот еще статьи Как создать пользовательские страницы ошибок с помощью MVC http://kitsula.com/Article/MVC-Custom-Error-Pages .
источник
Вы также можете сделать это в файле Web.Config. Вот пример, который работает в IIS 7.5.
источник
Я вижу, вы добавили значение конфигурации для,
EnableCustomErrorPage
и вы также проверяете,IsDebuggingEnabled
стоит ли запускать обработку ошибок.Поскольку
<customErrors/>
в ASP.NET уже есть конфигурация (которая предназначена именно для этой цели), проще всего сказать:Затем в конфиге вы указали,
<customErrors mode="RemoteOnly" />
что безопасно развертывать подобным образом, и когда вам нужно протестировать свою пользовательскую страницу ошибок, вы установите ее<customErrors mode="On" />
так, чтобы вы могли убедиться, что она работает.Обратите внимание, что вам также необходимо проверить,
HttpContext.Current
является ли значение null, потому что исключение по-Application_Start
прежнему будет использовать этот метод, хотя активного контекста не будет.источник
Вы можете отобразить удобную страницу ошибок с правильным кодом статуса http, внедрив модуль удобной обработки исключений Джеффа Этвуда с небольшим изменением кода статуса http. Работает без перенаправлений. Хотя код 2004 года (!), Он хорошо работает с MVC. Он может быть полностью настроен в вашем файле web.config без каких-либо изменений исходного кода проекта MVC.
Модификация, необходимая для возврата исходного статуса HTTP, а не
200
статуса, описана в этом соответствующем сообщении на форуме .В основном, в Handler.vb вы можете добавить что-то вроде:
источник
Я использую MVC 4.5, и у меня были проблемы с решением Дарина. Примечание: решение Дарина превосходно, и я использовал его, чтобы придумать свое решение. Вот мое модифицированное решение:
источник