Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Ранее мы посмотрели, как можно назначить обработчик для обработки различных маршрутов. Но мы также можем переопределить базовый обработчик запроса при наличии некоторых условий.
С помощью модулей мы можем переопределить действия http-обработчика, не внося больших изменений в код приложения. При переопределении обработчика нам надо учитывать,
что обработчик запроса выбирается при возникновении события MapRequestHandler
. Поэтому переопределение обработчика должно происходить на более ранней стадии.
Итак, добавим в проект следующий модуль:
public class HandlerSelectionModule : IHttpModule { public void Init(HttpApplication app) { app.PostResolveRequestCache += (src, args) => { if (string.Equals((string)app.Context.Request.RequestContext.RouteData.Values["controller"], "Home", StringComparison.OrdinalIgnoreCase) && string.Equals((string)app.Context.Request.RequestContext.RouteData.Values["action"], "Index", StringComparison.OrdinalIgnoreCase)) { app.Context.RemapHandler(new UserInfoHandler()); } }; } public void Dispose() {} }
Поскольку нам надо переопределить обработчик запроса до события MapRequestHandler
, то мы это делаем при обработке другого события - PostResolveRequestCache
,
которое возникает до MapRequestHandler
. Модуль сравнивает данные, полученные из контекста запроса, в частности, сравниваем контроллер и метод.
И если окажется, что запрос предназначался к методу Index контроллера HomeController, то вызывается http-обработчик UserInfoHandler
,
который я взял из одной из предыдущих тем.
Для переопределения http-обработчика используется метод RemapHandler()
, который имеется у объекта контекста HttpContext
.
И после определения модуля зарегистрируем его в web.config:
<system.webServer> <modules> <add name="Selector" type="LifeCycleApp.Modules.HandlerSelectionModule"/> </modules> <handlers> <add name="MyHttpHandler" path="*" verb="GET" type="LifeCycleApp.Handlers.UserInfoHandler" /> </handlers> </system.webServer>
И если мы перейдем по запросу Home/Index, то данный запрос будет перехвачен модулем, и его обработчик будет изменен на UserInfoHandler.
Мы можем проконтролировать
выбор обработчика, добавив в ответ клиенту название http-обработчика. Для этого добавим в метод Init()
модуля обработчик события EndRequest
:
app.EndRequest += (src, args) => { app.Context.Response.Write("<p>Handler: " + app.Context.Handler.ToString() + "</p>"); };