Я разрабатываю приложение в asp.net MVC3, и у меня есть следующие вопросы: Когда следует писать HTTP-модуль и когда следует писать фильтр действий?
HTTP-модуль против фильтра действий в asp.net-mvc
Ответ 1
-
Фильтр - это более MVC-подход к работе, тогда как Http-модуль - это более простой способ ASP.NET. Оба служат схожим назначением, обеспечивая крючок в технологической линии.
-
HttpModule более общий и когда вы хотите, чтобы какая-то вещь обрабатывалась по каждому запросу. Фильтры полезны для добавления определенного действия.
-
Если вы хотите, чтобы какая-то вещь выполнялась только один раз за запрос Http, вы должны использовать HttpModule. ActionFilter может выполняться несколько раз во время запроса до тех пор, пока вы не проверите IsChildActionOn.
Ответ 2
HttpModule вызывается до и после выполнения обработчика запросов. Они предназначены для того, чтобы разработчик мог перехватывать, участвовать или изменять каждый запрос. Существует 22 доступных события, на которые можно подписаться, что позволяет модулю работать с запросом на разных этапах процесса. События полезны для разработчиков страниц, которые хотят запускать код, когда возникают события конвейерного запроса. Они также полезны, если вы разрабатываете настраиваемый модуль и хотите, чтобы модуль вызывался для всех запросов к конвейеру.
Фильтры предназначены для ввода логики между жизненным циклом запроса MVC. В частности, до и после того, как действие вызывается, а также до и после обработки результата. Фильтры предоставляют пользователям мощные способы проверки, анализа, захвата и использования нескольких вещей, проходящих в рамках проектов MVC. С MVC5 существует 5 типов фильтров:
- Аутентификация
- Разрешение
- Действие
- Результат
- Exception
Итак, если вы хотите перехватить, принять участие или изменить в конкретном 22 событиях в конвейере http-запроса, выберите модули. Если ваша логика строго связана с методом действия, вы лучше перенаправляете сервер на один из следующих методов ActionFilterAttribute:
- OnActionExecuting
- OnActionExecutted
- OnResultExecuting
- OnResultExecuted
Ответ 3
HttpModule - это то, как IIS позволяет веб-приложению переопределять поведение по умолчанию или добавлять пользовательскую логику, позволяя присоединить обработчики событий к событиям HttpApplication.
Различные режимы IIS (Integrated или Classic) даже используют разные настройки Web.config.
Ссылки:
http://msdn.microsoft.com/en-us/library/ms227673(v=vs.100).aspx
Пример: перенаправление не-www на www URL
public void Init(HttpApplication application)
{
application.PreRequestHandlerExecute += this.Application_PreRequestHandlerExecute;
}
private void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
Uri requestUrl = HttpContext.Current.Request.Url;
string host = requestUrl.Authority.ToLower();
if (!host.StartsWith("www"))
{
HttpContext.Current.Response.Redirect(requestUrl.Scheme + "://www." + host + requestUrl.PathAndQuery);
HttpContext.Current.Response.End();
}
}
Фильтр действий - это атрибут, декорирующий контроллеры или методы действий. Это слой абстракции между маршрутами MVC и действиями. С фильтрами действий мы можем применять одну и ту же логику к нескольким контроллерам или методам действий. например, пользовательское ведение журнала.