Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Пред тем как приступить к созданию собственного обработчика маршрутов, посмотрим, что в целом представляет собой процесс маршрутизации.
Процесс маршрутизации состоит из следующих этапов:
Модуль UrlRoutingModule
пытается сопоставить текущий запрос с маршрутами в таблице RouteTable
.
Если сопоставление завершилось удачно, то модуль маршрутизации выбирает обработчик маршрутов сопоставленного маршрута - объект IRouteHandler.
Затем у объекта IRouteHandler
вызывается метод GetHandler
, который возвращает объект IHttpHandler
,
используемый для обработки запроса.
У обработчика IHttpHandler
вызывается метод ProcessRequest
для обработки запросов.
По умолчанию обработчик запросов или объект IRouteHandler
представляет экземпляр класса MvcRouteHandler
,
который возвращает объект MvcHandler
, применяющий интерфейс IHttpHandler
. Этот объект MvcHandler
отвечает за инициализацию контроллера, который потом уже вызывает одно из своих действий.
Однако мы можем переопределить это поведение, указав при определении маршрута свой обработчик маршрутов. Итак, сначала создадим сам обработчик.
Для обработчика создадим какую-нибудь специальную папку в проекте и добавим в нее новый класс. Назовем его MyRouteHandler
:
using System.Web; using System.Web.Routing; namespace Routing.RouteHandlers { public class MyRouteHandler : IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { return new MyHttpHandler(); } } public class MyHttpHandler : IHttpHandler { public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { context.Response.Write("Инопланетное послание : Привет мир!"); } } }
Как было уже сказано про этапы маршрутизации, нам нужно собственно два класса: класс, реализующий интерфейс IHttpHandler, который и будет обрабатывать запрос; и класс, реализующий интерфейс IRouteHandler, который сопоставляется с маршрутом, и вызывает первый класс.
Теперь в классе RouteConfig
пропишем маршрут, который будет обрабатываться нашим обработчиком, не забывая при этом импортировать
пространство имен, в котором объявлен наш обработчик:
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); Route newRoute = new Route("{controller}/{action}", new MyRouteHandler()); routes.Add(newRoute); } }
Теперь мы можем адресовать нашему приложению соответствующий запрос, например, Home/Index и браузер выведет нам нашу строку с посланием.