2012-03-01 2 views
1

В документации MSDN указано:Является ли HttpContext.RemapHandler, чтобы изменить, какой обработчик обрабатывает запрос?

HttpContext.RemapHandler Method - позволяет указать обработчик для запроса.

Я пытаюсь переместить обработку запроса от одного обработчика к другому в зависимости от состояния в первом обработчике. Метод HttpContext.RemapHandler, похоже, инициализирует экземпляр второго обработчика, но не вызывает метод HttpHandler.ProcessRequest; ответ пуст.

Способ HttpContext.RemapHandler делает то, что я думаю, что он должен - передать обработку новому HttpHandler и вызвать метод HttpHandler.ProcessRequest? Или я должен использовать другой подход, такой как другой метод или HttpModule?

EDIT: Оказывается, я должен использовать HTTPHandlerFactory. У меня теперь хорошо работает решение.

Так что же такое HttpContext.RemapHandler?

ответ

6

Вы можете использовать HttpContext.RemapHandler, как было указано, однако, если еще HttpHandler вызовы RemapHandler (например, ASP.NET MVC, который регистрирует MvcHandler в PostResolveRequestCache) ваш IHttpModule никогда не будет огня. Возможно, поэтому IHttpHandler.Process никогда не назывался.

Если это ваш вопрос, вы можете просто определить маршрут игнорировать в MvcApplication.RegisterRoutes так:

routes.IgnoreRoute("your_path/{*pathInfo}"); 

Кроме того, помните, что с Visual Studio Server, Web Development и IIS6, RemapHandler не будет работать ,

Вот пример того, как выбрать правильный способ переназначить обработчик в зависимости от того или нет интегрированного трубопровода активируется и еще быть в состоянии получить доступ к сеансу:

public void Init(HttpApplication application) 
{ 
    if (HttpRuntime.UsingIntegratedPipeline) 
    // For IIS 7 and IIS 8 
    application.PostAuthorizeRequest += Application_PostAuthorizeRequest; 
    else 
    // For IIS 6 
    application.PostMapRequestHandler += Application_PostMapRequestHandler; 
} 

private void Application_PostAuthorizeRequest(object sender, EventArgs e) 
{ 
    ((HttpApplication)sender).Context.RemapHandler(_myHandler); 
} 

private void Application_PostMapRequestHandler(object sender, EventArgs e) 
{ 
    ((HttpApplication)sender).Context.Handler = _myHandler; 
} 

Разница между использованием HttpHandlerFactory и HttpModule в этом случае состоит в том, что последний позволяет вам решить, когда использовать IHttpHandler вне зависимости от ASP.NET IHttpHandler сопоставлений. Подробнее о MSDN: HTTP Handlers and HTTP Modules Overview.

+0

Четкий ответ, особенно часть о обработчике mvc !. Thnx! –

+0

RemapHandler отлично работает в PostAuthorizeRequest, если у вас установлен .NET 2.0 Service Pack 2. –