Время жизни контроллера или httpmodule очень разное.Эта ссылка показывает жизненный цикл приложения asp.net:
http://msdn.microsoft.com/en-us/library/bb470252.aspx
Хотя он не предназначен специально для asp.net mvc, инфраструктура mvc подключается к этому жизненному циклу и следует по этому конвейеру.:
http://ajaxus.net/wp-content/uploads/2010/01/asp_net_mvc_poster.pdf
С http://www.asp.net/mvc/tutorials/understanding-the-asp-net-mvc-execution-process-vb
Запросы к веб-приложению на основе ASP.NET MVC сначала проходят через объект UrlRoutingModule, который являетсяМодуль HTTP.Этот модуль анализирует запрос и выполняет выбор маршрута.Объект UrlRoutingModule выбирает первый объект маршрута, соответствующий текущему запросу.(Объект маршрута - это класс, который реализует RouteBase и, как правило, является экземпляром класса Route.) Если ни один из маршрутов не совпадает, объект UrlRoutingModule ничего не делает и позволяет запросу вернуться к обычной обработке запросов ASP.NET или IIS.
Из выбранного объекта Route объект UrlRoutingModule получает объект IRouteHandler, связанный с объектом Route.Как правило, в приложении MVC это будет экземпляр MvcRouteHandler.Экземпляр IRouteHandler создает объект IHttpHandler и передает ему объект IHttpContext.По умолчанию экземпляр IHttpHandler для MVC является объектом MvcHandler.Затем объект MvcHandler выбирает контроллер, который в конечном итоге будет обрабатывать запрос.
HttpModule подключается к жизненному циклу приложения и может выполнять код до того, как будет создан экземпляр контроллера или после его удаления, в зависимости от того, в какомсобытия, которые он обрабатывает из жизненного цикла приложения.Поэтому он не может использовать обработку исключений контроллера.
Если вы хотите правильно обработать исключение в модуле http, я думаю, что у вас есть 2 варианта:
- Когда вы ловитеИсключение: вы можете изменить ответ на запрос.Вы можете вставить ошибку div или заменить весь ответ сообщением об ошибке или просто зарегистрировать исключение.В этом случае запрос будет следовать за остальной частью конвейера.
- Или вы можете выбросить исключение и обработать его в методе global.asax Application_Error.В этом сценарии контроллер не будет выполнен.
Если HttpModule выдает допустимое исключение, я бы выбрал вариант 2. Вы можете выдать собственное исключение и обработать его по-другому в глобальном.asax, даже возвращая ответ HTTP (400 неверных запросов).
Обновление
Если в HttpModule возникает исключение, оно будет перехвачено методом Application_Error.Я попробовал следующий фрагмент кода, который работает, хотя кажется, что он неправильный:
protected void Application_Error()
{
var ex = Server.GetLastError(); // get the last exception that was made
if (ex == null) return; // if there is no exception, just continue
Response.ClearContent();
Response.Write("{'error':'" + ex.Message + "'}");
Response.ContentType = "application/json";
Response.Flush(); // flush the content to the client
Response.Close(); // and close the connection so that no other content can be written to the response
Server.ClearError(); // clear the error so that asp.net does not use the custom error page. If we don't close the response and clear the error, the request will still be handled in the rest of the pipeline.
}