Generic Handler Url Routing / Маршрутизация хендлера

Допустим есть у нас хендлер, расположенный по пути /Handlers/DataHandler.ashx
Не суть важно что он делает (отдаёт капчу, футболку виртуальной команды, изменённую картинку и т.п.), важно то, что вам почему-то захотелось сделать так, чтобы хендер отрабатывал по ссылке вида /somehandler/{dataKey}

Итак, хендлер вот такой:



Первое что приходит на ум - прописать вот такой роутинг:



Но что поделать, вы словите
  1. System.Web.HttpException:
  2. Тип 'Handlers.DataHandler' не является производным от 'System.Web.UI.Page'.

т.к. в классе BuildManager в методе CreateInstanceFromVirtualPath написана проверка на базовый тип (стр. 12):



Решение очень простое

Если необходимо обращаться к хендлеру через URL Routing, то файл .ashx не нужен

Необходимо создать класс наследник от UrlRoutingHandler.
Этот абстрактный класс сам реализует интерфейс IHttpHandler
Нам необходимо лишь определить метод VerifyAndProcessRequest:



Ввиду того, что в маршрут необходимо передавать IRouteHandler для упрощения регистрации хендлеров в будущем - делаем такой простой класс:


И вот так регистрируем хендлер:



т.е. вот все шаги:

  1. Создаём базовый BaseDataHandler (скорее BaseRouteHandler). Этот шаг выполняется лишь раз
  2. Далее - создаём хендлер, но с учётом того, что данные можно брать из RouteData
  3. Регистрируем хендлер, на какой-угодно маршрут и всё

Комментариев нет:

Отправить комментарий

Можете оставить свой комментарий