Переопределение HTTP-обработчика

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Ранее мы посмотрели, как можно назначить обработчик для обработки различных маршрутов. Но мы также можем переопределить базовый обработчик запроса при наличии некоторых условий.

С помощью модулей мы можем переопределить действия 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>");
};
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850