HttpContext.RemapHandler是否应该更改哪个处理程序处理请求?

问题描述:

MSDN文档说:HttpContext.RemapHandler是否应该更改哪个处理程序处理请求?

HttpContext.RemapHandler方法 - 使您能够为请求指定处理程序。

我试图将请求的处理从一个处理程序移动到另一个处理程序,具体取决于第一个处理程序中的条件。 HttpContext.RemapHandler方法似乎初始化第二个处理程序的实例,但不调用HttpHandler.ProcessRequest方法;响应是空的。

HttpContext.RemapHandler方法是否执行我认为应该的操作 - 将处理转移到新的HttpHandler并调用HttpHandler.ProcessRequest方法?或者我应该使用另一种方法,如另一种方法或HttpModule?编辑: 原来我应该使用HTTPHandlerFactory。我现在有很好的解决方案。

那么HttpContext.RemapHandler到底是什么?

您可以使用HttpContext.RemapHandler为你指定的,但是如果另一HttpHandler电话RemapHandler(例如ASP.NET MVC这PostResolveRequestCache注册MvcHandler)您IHttpModule将永远不会触发。这也许是为什么IHttpHandler.Process从未被调用。

如果这是你的问题,你可以简单地定义路由在MvcApplication.RegisterRoutes忽略这样的:

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

另外请记住,使用Visual Studio的Web开发服务器和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! – 2013-01-25 12:10:12

+0

如果应用了.NET 2.0 Service Pack 2,RemapHandler将在PostAuthorizeRequest中正常工作。 – 2014-09-11 18:44:33