Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
HTTP-обработчики (HTTP Handlers) используются для генерации содержимого ответа на HTTP-запрос. Мы можем использовать HTTP-обработчики для настройки обработчик запросов. При обработке одного запроса мы можем задействовать несколько различных модулей, но только один http-обработчик может быть сопоставлен с запросом.
HTTP-обработчик представляет класс, реализующий интерфейс System.Web.IHttpHandler. Данный интерфейс определяет один метод и одно свойство:
ProcessRequest(context): данный метод в качестве параметра принимает объект контекста запроса HttpContext и генерирует ответ клиенту
IsReusable: это свойство указывает, будет ли данный обработчик использоваться другими запросами
HTTP-обработчик выбирается системой после возникновения события MapRequestHandler
. И сразу после выбора обработчика срабатывает событие
PostMapRequestHandler
Непосредственная генерация ответа обработчиком происходит после события PreRequestHandlerExecute
- после этого события происходит вызов метода ProcessRequest
и
генерация ответа. А сразу после генерации ответа возникает событие PostRequestHandlerExecute
Рассмотрим на примере. Создадим свой простенький Http-обработчик.
Для этого вначале определим в проекте каталог Handlers, который будет содержать файлы обработчиков. Затем в этот каталог добавим новый класс UserInfoHandler:
public class UserInfoHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { string result = "<p>Ваш IP: "+context.Request.UserHostAddress+"</p>"; result+="<p>UserAgent: "+context.Request.UserAgent+"</p>"; context.Response.Write(result); } public bool IsReusable { get { return false; } } }
Обработчик просто возвращает ip и данные строки user-agent клиенту.
Теперь этот обработчик надо подключить к обработке запросов. Это можно сделать двумя способами. Первый способ заключается в вызове обработчика через обработчик маршрутов. Для этого откроем файл RouteConfig и изменим его содержание следующим образом:
using LifeCycleApp.Handlers; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace LifeCycleApp { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.Add(new Route("handler/{*path}", new CustomRouteHandler())); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } // обработчик маршрута class CustomRouteHandler : IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { return new UserInfoHandler(); } } }
Выражение routes.Add(new Route("handler/{*path}", new CustomRouteHandler()))
добавляет новый маршрут, который обрабатывает класс CustomRouteHandler.
В свою очередь этот обработчик маршрутов будет вызывать определенный выше HTTP-обработчик.
Второй способ заключается в определении обработчика в файле web.config. Для этого в файле конфигурации в узле system.webServer (если его нет, то надо создать) пропишем определение обработчика:
<?xml version="1.0" encoding="utf-8"?> <configuration> <!--остальное содержимое--> <system.webServer> <handlers> <add name="MyHttpHandler" path="/handler/" verb="GET" type="LifeCycleApp.Handlers.UserInfoHandler"/> </handlers> </system.webServer> </configuration>
Все обработчики задаются в элементе handlers
. Каждое определение имеет следующие атрибуты:
name
: уникальное название обработчика
path
: запрос URL, который будет обрабатываться обработчиком
verb
: тип запрос, например, GET. Мы также можем поставить любой тип запроса - в этом случае используется звездочка (*)
type
: полный тип класса обработчика
Кроме регистрации в web.config нам надо также добавить игнорирование маршрута в файле RouteConfig.cs, иначе система маршрутизации будет неправильно обрабатывать данный маршрут:
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("handler/{*path}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
Воспользовавшись одним из способов регистрации HTTP-обработчика, мы сможем обратиться к серверу с запросом типа http://localhost:3406/handler/, и тогда браузер выведет информацию с ip-адресом и user-agentом.