Допустим есть у нас хендлер, расположенный по пути /Handlers/DataHandler.ashx
Не суть важно что он делает (отдаёт капчу, футболку виртуальной команды, изменённую картинку и т.п.), важно то, что вам почему-то захотелось сделать так, чтобы хендер отрабатывал по ссылке вида /somehandler/{dataKey}
Итак, хендлер вот такой:
Первое что приходит на ум - прописать вот такой роутинг:
Но что поделать, вы словите
т.к. в классе BuildManager в методе CreateInstanceFromVirtualPath написана проверка на базовый тип (стр. 12):
Необходимо создать класс наследник от UrlRoutingHandler.
Этот абстрактный класс сам реализует интерфейс IHttpHandler
Нам необходимо лишь определить метод VerifyAndProcessRequest:
Ввиду того, что в маршрут необходимо передавать IRouteHandler для упрощения регистрации хендлеров в будущем - делаем такой простой класс:
И вот так регистрируем хендлер:
т.е. вот все шаги:
Не суть важно что он делает (отдаёт капчу, футболку виртуальной команды, изменённую картинку и т.п.), важно то, что вам почему-то захотелось сделать так, чтобы хендер отрабатывал по ссылке вида /somehandler/{dataKey}
Итак, хендлер вот такой:
Первое что приходит на ум - прописать вот такой роутинг:
Но что поделать, вы словите
- System.Web.HttpException:
- Тип 'Handlers.DataHandler' не является производным от 'System.Web.UI.Page'.
т.к. в классе BuildManager в методе CreateInstanceFromVirtualPath написана проверка на базовый тип (стр. 12):
Решение очень простое
Если необходимо обращаться к хендлеру через URL Routing, то файл .ashx не нуженНеобходимо создать класс наследник от UrlRoutingHandler.
Этот абстрактный класс сам реализует интерфейс IHttpHandler
Нам необходимо лишь определить метод VerifyAndProcessRequest:
Ввиду того, что в маршрут необходимо передавать IRouteHandler для упрощения регистрации хендлеров в будущем - делаем такой простой класс:
И вот так регистрируем хендлер:
т.е. вот все шаги:
- Создаём базовый BaseDataHandler (скорее BaseRouteHandler). Этот шаг выполняется лишь раз
- Далее - создаём хендлер, но с учётом того, что данные можно брать из RouteData
- Регистрируем хендлер, на какой-угодно маршрут и всё
Комментариев нет:
Отправить комментарий
Можете оставить свой комментарий