Asp.Net IHttpHandler представлен ASP.NET двух часто используемых интерфейсов обработки при реагировании на http-запросы являются IHttpHandler и IHttpModule.
В целом IHttpHandler используется для обработки определённого типа запроса, например, отдельной обработки каждого файла *.asp, *.aspx. IHttpModule обычно используется для обработки операций, которые обычно требуются для запроса, например, выполнения некоторых из тех же проверок на странице запроса.
Давайте рассмотрим этапы обработки IIS-сервера при выполнении соответствующего HTTP-запроса. ASP.NET имеет понятие конвейера, что означает, что каждый ASP.NET запрос будет иметь серию соответствующих операций в IIS для формирования линейной последовательности.
ASP.NET введение в конвейер
Давайте посмотрим на схему тайминга обработки в конвейере:
Как видно на рисунке, после прибытия запроса реализация обрабатывается HttpModule, и затем вызывается метод ProcessRequest() HttpHandler для получения конкретного ответа. Поэтому несложно понять, почему обработка классоспецифических запросов размещена в классе HttpHandler при выполнении некоторых проверок, общих для всех запросов в HttpModule.
Практика кода
IHttpHandler
Автор недавно столкнулся с использованием IHttpHandler для обработки вызовов клиентского интерфейса в проекте, поэтому давайте кратко обсудим простой дизайн интерфейса на основе IHttpHandler.
Интерфейс IHttpHandler состоит только из двух участников:
Атрибут IsReusable определяет, могут ли объект HttpHandler использоваться другими экземплярами, и обычно мы устанавливаем его в True. Метод ProcessRequest() — это конкретный ответ на запрос, и нам нужно указать здесь только конкретную операцию бизнес-логики.
Сначала создайте новый веб-проект и добавьте класс Handler:
Класс RayHandler реализует функцию ProcessRequest() интерфейса IHttpHandler, которая является прямым выходом текста.
Затем нужно добавить следующую конфигурацию в файл Web.config:
path указывает на совпадение URL, например *.ray, что означает, что обработчик отвечает на запросы URL, заканчивающиеся на «.ray», глагол указывает на метод запроса, например Get/Post, а * означает, что он совпадает со всеми. тип указывает на тип класса обработчика, WebApplication2. RayHandler — это имя класса, WebApplication2 — название ассемблера в каталоге Bin, например, имя ассемблера в примере — WebApplication2.dll, и здесь нет необходимости определять суффиксное имя.
Запустите сайт, введите URL, заканчивающийся на «.ray», и вы увидите следующий результат:
Обзор IHttpHandlerFactory
Иногда нам приходится работать с несколькими суффиксами, один из которых соответствует классу обработчика, и вот как выглядит наш файл Web.config:
Если у нас много классов реализации HttpHandler, то конфигурация файла Web.config будет выглядеть многословно. Или в некоторых случаях, когда мы можем определить, какой обработчик отвечает только во время работы программы, нужно использовать IHttpHandlerFactory.
IHttpHandlerFactory определяется следующим образом:
Среди них:
GetHandler(): Возвращает экземпляр, реализующий интерфейс IHttpHandler; ReleaseHandler(): Позволяет Factory повторно использовать существующий экземпляр обработчика. Возьмём вышеуказанные запросы на луч и rss в качестве примера, реализуйте класс Factory:
В этом случае конфигурация в Web.config выглядит следующим образом:
В настоящее время реализована функция использования класса Factory для соответствия различным конкретным обработчикам, что упрощает конфигурацию.
Масштабируемый IHttpHandlerFactory
В приведённой выше реализации, если программе в будущем потребуется добавить новый метод обработки суффиксов, ей необходимо изменить оператор Switch в GetHandler(), что также может вызвать ошибки или другие риски безопасности. Итак, возможно ли оставить класс HandlerFactory без изменений для последующих расширений?
Ответ определённо да. Читатели, знакомые с шаблоном проектирования, должны понимать, что это простая фабричная схема, и для реализации предыдущих функций можно использовать режим проектирования, называемый расширенными точками.
Здесь мы также можем использовать языковую функцию языка C# — рефлексию. С помощью механизма отражения C# мы отражаем соответствующий тип Ханлдера согласно суффиксу URL, при условии, что мы согласуем соответствие между именем суффикса URL и названием класса обработчика.
Например, мы переписываем GetHandler() следующим образом:
В этом случае достаточно поместить класс Handler в метод под тем же пространством имён, что и класс HandlerFactory, и правильно настроить его в Web.config. Например, если существует класс RayHandler, то следует добавить следующую конфигурацию для автоматического соответствия:
сводка В этой статье кратко представлено использование IHttpHandler в ASP.NET году, представлена реализация IHttpHandlerFactory для обработки нескольких запросов обработчиков и, наконец, улучшается масштабируемая многозапросная реализация обработчика с использованием механизма отражения C#.
|