Skip to main content
 首页 » 编程设计

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

2024年01月28日29Leo_wl

MSDN 文档说:

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 Development Server 和 IIS6,RemapHandler 将不起作用。

下面是一个示例,说明如何根据 Integrated Pipeline 是否已激活并且仍然能够访问 session 来选择重新映射处理程序的正确方法:

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 .