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

时间:2012-03-01 03:10:30

标签: c# httphandler remap

MSDN文档说:

HttpContext.RemapHandler方法 - 允许您为请求指定处理程序。

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

HttpContext.RemapHandler方法是否按照我的想法执行 - 将处理转移到新的HttpHandler并调用HttpHandler.ProcessRequest方法?或者我应该使用其他方法,如另一种方法或HttpModule?

编辑: 事实证明我应该使用HTTPHandlerFactory。我现在的解决方案很好用。

那么HttpContext.RemapHandler究竟是什么?

1 个答案:

答案 0 :(得分:6)

您可以按照指定使用HttpContext.RemapHandler,但是如果另一个HttpHandler调用RemapHandler(例如,在MvcHandler中注册PostResolveRequestCache的ASP.NET MVC) IHttpModule永远不会开火。这可能是为什么IHttpHandler.Process从未被调用过的原因。

如果这是您的问题,您只需在MvcApplication.RegisterRoutes中定义一条要忽略的路线:

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

另外,请记住,使用Visual Studio Web Development Server和IIS6时,RemapHandler将无效。

以下示例说明如何根据Integrated Pipeline是否已激活并仍能访问会话来选择重新映射处理程序的正确方法:

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;
}

在这种情况下使用HttpHandlerFactoryHttpModule之间的区别在于,后者允许您决定何时使用哪个IHttpHandler而不管ASP.NET IHttpHandler映射。有关MSDN的更多信息:HTTP Handlers and HTTP Modules Overview