asp.net настраиваемый HttpHandler и маршрутизация URL - PullRequest
6 голосов
/ 01 декабря 2010

Я хочу обработать запросы к моему приложению "http://example.com/whateverpath" пользовательским HttpHandler, но возвращаю вещи в зависимости от значения" whatpath ".

Таким образом, пользователи, обращающиеся к «http://example.com/path1"», получат ответ, отличный от пользователей, обращающихся к «http://example.com/path2",, но оба запроса должны быть обработаны в одном HttpHandler. Идея состоит в том, чтобы найти «whatpath» в базе данных и, в зависимости от результата, вернуть содержимое ответа.

Я слышал о маршрутизации URL, и у меня уже есть собственный обработчик Http, но могу ли я объединить оба метода, чтобы получить то, что мне нужно?

Буду признателен за любые комментарии относительно этой проблемы.

Приветствие Фрэнк Абель

Ответы [ 3 ]

4 голосов
/ 21 января 2011

Итак, у вас есть класс, который реализует IHttpHandler с именем: MyHandler, и он находится в пространстве имен Example, вам необходимо сделать следующие записи в Web.Config сайта в разделе httpHandlers :

<httpHandlers>
  <add verb="*" path="*" type="Example.MyHandler"/>
</httpHandlers>

Поскольку при этом перенаправляются все URL-адреса вашего веб-сайта / приложения на ваш обработчик, вы должны подумать о том, как обслуживать статический контент (imgs, сценарии, таблицы стилей и т. Д.). Одним из способов является сохранение такого статического содержимого в согласованном URL-адресе, таком как http://example.com/static/..., затем вы можете установить свои обработчики следующим образом:

<httpHandlers>
  <add verb="*" path="*" type="Example.MyHandler"/>
  <add verb="GET,HEAD" path="static/*" type="System.Web.StaticFileHandler" />
</httpHandlers>

Для вашего локального веб-сервера разработки (встроенного в Visual Studio) это все, что нужно. Для IIS также необходимо указать IIS, как обращаться с этими URL-адресами (поскольку сервер сначала анализирует запрос, чтобы решить, куда его отправлять, в том числе отправлять его в ASP.NET или другое расширение).

  • Открыть: диспетчер IIS ->
  • Раздел: Сайты ->
  • Щелкните правой кнопкой мыши на своем сайте ->
  • Опция: Свойства ->
  • Вкладка: Home Directoy ->
  • Кнопка: [Конфигурация ...] ->
  • Вкладка: Сопоставления ->
  • Раздел: «Карты приложений с подстановочными знаками (порядок реализации):» ->
  • Кнопка: [Вставить ...] ->
  • Исполняемый файл: «C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ aspnet_isapi.dll» (или любая другая версия среды выполнения .NET, используемая вашим обработчиком) ->
  • Снимите флажок «Убедитесь, что файл существует» ->
  • Кнопка: [OK]

Теперь и IIS, и ASP.NET знают, как обращаться с вашими URL-адресами.

Приведенный выше подход означает, что при запросе статических файлов ASP.NET фактически обслуживает файлы, а не IIS - что приводит к нескольким недостаткам (обсуждается здесь ). Вы можете переопределить это поведение (отключить сопоставление с подстановочными знаками из статического каталога), переключив каталог на приложение (в диспетчере IIS), удалив оператор сопоставления с подстановочными знаками (добавленный выше) и переключив его обратно из приложения. Вуаля - статические файлы обрабатываются IIS без приставания к вашему ASP.NET.

0 голосов
/ 08 мая 2012

Прежде всего, я бы согласился с предыдущим постом Джонатана Вуда, что использование маршрутизации в HttpHandler не является хорошей идеей. Но я почти уверен, что он имел в виду стандартную маршрутизацию MVC.

Хорошим подходом было бы использование пользовательской маршрутизации. Я опубликовал статью об этом - Basic Routing for HttpHandler

0 голосов
/ 13 января 2011

Я не рекомендую сочетать маршрутизацию URL и обработчики HTTP.

Это похоже на идеальную работу для маршрутизации URL.Однако я бы не использовал для этого обработчик HTTP.

Просто сопоставьте «~ / CustomData / whatpath» со страницей ASPX.Затем попросите страницу загрузить данные из базы данных.В конце концов, если логика поиска данных одна и та же, независимо от того, что такое «независимо от пути», вы не хотите повторять свою логику для каждого варианта.Вместо этого вы хотите сопоставить его с одним файлом, который будет загружать правильные данные для всех случаев.

Обработчики HTTP - это совсем другое дело, и их не следует использовать для этой цели.(Кстати, я только что опубликовал статью о обработчиках HTTP. Вы можете просмотреть ее на http://www.blackbeltcoder.com/Articles/asp/writing-a-custom-http-handler-in-asp-net).

...