HttpContext.RemapHandler是否应该更改处理请求的处理程序

本文关键字:处理 请求 程序 RemapHandler 是否 HttpContext | 更新日期: 2023-09-27 18:26:08

MSDN文档中写道:

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

我正试图根据第一个处理程序中的条件,将请求的处理从一个处理程序移动到另一个。HttpContext.RemapHandler方法似乎初始化了第二个处理程序的实例,但没有调用HttpHandler.ProcessRequest方法;响应为空。

HttpContext.RemapHandler方法是否做了我认为应该做的事情——将处理转移到一个新的HttpHandler并调用HttpHandler.ProcessRequest方法?或者,我应该使用另一种方法,比如另一个方法或HttpModule?

编辑:原来我应该使用HTTPHandlerFactory。我的解决方案现在运行得很好。

那么HttpContext.RemapHandler到底是干什么的呢?

HttpContext.RemapHandler是否应该更改处理请求的处理程序

您可以按照指定使用HttpContext.RemapHandler,但如果另一个HttpHandler调用RemapHandler(例如,在PostResolveRequestCache中注册MvcHandler的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处理程序和HTTP模块概述。