HTTP-обработчики

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

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

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ом.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850