Как установить собственный HttpHandler без использования HttpContext.RemapHandler - PullRequest
5 голосов
/ 04 августа 2011

Вот сценарий:

У меня есть HttpHandler, который я хотел бы запустить для определенных URL-адресов, но эти URL-адреса не имеют постоянных расширений, поэтому я не могу сопоставить обработчик, используя httpHandlers в Интернете.config.

Вместо этого у меня есть собственный HttpModule, в котором я подписываюсь на PostAuthenticateRequest, проверяю некоторые условия и назначаю свой пользовательский обработчик, используя HttpContext.RemapHandler (), если текущий URL подходит.

Это все прекрасно работает, но ...

Чтобы повысить производительность, я хотел бы выполнять проверку URL и назначение обработчиков, только если обработчик еще не назначен.Я не буду утомлять вас тем, почему мой обработчик применяется только тогда, когда никакой другой обработчик не назначен, но это всегда так.

Реальная проблема здесь заключается в том, что можно проверить только, если обработчик уже назначен в PostMapRequestHandler,и к тому времени уже слишком поздно использовать RemapHandler (), потому что будет выдано исключение InvalidOperationException (см. http://msdn.microsoft.com/en-us/library/system.web.httpcontext.remaphandler.aspx)

. Я думаю, что в этот момент может работать (но не работает) HttpContext.Handler = x; вместо HttpContext.RemapHandler (x);

При установке таким образом HttpContext.CurrentHandler обновляется и все выглядит великолепно, но ProcessRequest () пользовательского обработчика никогда не вызывается.

Спасибозаранее за ваши мысли / комментарии / понимание.

1 Ответ

3 голосов
/ 15 сентября 2011

Вы видели это?Вы можете использовать маршрутизацию, чтобы получить не совпадающие конечные расширения для одного и того же обработчика.

См. http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

ОБНОВЛЕНО

Я бы предложил, еслиу вас проблемы с установкой обработчиков, вы можете попробовать обработать событие PostResolveRequestCache.Именно в этот момент модуль маршрутизации Url подключается для выбора обработчика, вызывая context.RemapHandler.Возможно, вы могли бы даже переопределить метод PostResolveRequestCache для UrlRoutingModule и вызвать base.PostResolveRequestCache(context), а затем установить свой обработчик, если требуется.

В качестве альтернативы вы можете посмотреть, как всегда отображать свой обработчик в нижней части стека в сети.конфиг с ловить все.Затем не требуются сквозные запросы, которые не интересны или отменяют отображение обработчика (не уверен, что unmap будет работать), если не требуется.

Надеюсь, эта помощь.Пожалуйста, дайте нам знать, как вы идете.

...