К сожалению, уже совсем поздно добавлять такое в ASP.NET 4, но оно оказывается тривиально простым для написания. По сути вот оно:
public class HttpHandlerRouteHandler<THandler>
: IRouteHandler where THandler : IHttpHandler, new()
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new THandler();
}
}
Конечно, оно само по себе не особо полезно. Нам нужен метод-расширитель (“extension method”) для того чтобы действительно было просто регистрировать маршруты для HttpHandler’ов.Я написал целый ряд их, но только два примера тут в моем блоге. Остальные вы можете получить скачав проект внизу этого поста.
public static class HttpHandlerExtensions
{
public static void MapHttpHandler<THandler>(this RouteCollection routes, string url) where THandler : IHttpHandler, new()
{
routes.MapHttpHandler<THandler>(null, url, null, null);
}
//...
public static void MapHttpHandler<THandler>(this RouteCollection routes, string name, string url, object defaults, object constraints) where THandler : IHttpHandler, new()
{
var route = new Route(url, new HttpHandlerRouteHandler<THandler>());
route.Defaults = new RouteValueDictionary(defaults);
route.Constraints = new RouteValueDictionary(constraints);
routes.Add(name, route);
}
}
Это дает нам очень простую возможность регистрировать маршрут, который обрабатывается IHttpHandler'ом. В этом случае, я регистрирую маршрут, использующий мой SimpleHttpHandler для обработки любого двухсегментного URL.
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapHttpHandler<SampleHttpHandler>("{foo}/{bar}");
}
И здесь код SampleHttpHandler для завершения. Все что он делает, так это выводит значения маршрута.
public class SampleHttpHandler : IHttpHandler
{
public bool IsReusable
{
get { return false; }
}
public void ProcessRequest(HttpContext context)
{
var routeValues = context.Request.RequestContext.RouteData.Values;
string message = "I saw foo='{0}' and bar='{1}'";
message = string.Format(message, routeValues["foo"], routeValues["bar"]);
context.Response.Write(message);
}
}
Затем я делаю запрос для /testing/yo и вижу сообщение
“I saw foo='testing' and bar='yo'”
в моем браузере.
Здесь одно ограничение – мой http handler должен иметь конструктор без параметров. Это впринципе неплохое ограничение, так как ранее регистрируя маршрут необходимо было вводить проверку, что обработчик имеет пустой конструктор.
Вольный перевод статьи Phil Haack
Там же пример для Visual Studio 2010.
Комментариев нет:
Отправить комментарий