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

the*_*rrs 1 c# httphandler remap

MSDN文档说:

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

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

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

编辑:结果我应该使用HTTPHandlerFactory.我现在的解决方案很好用.

那么究竟什么是HttpContext.RemapHandler?

Chr*_*eau 6

你可以使用HttpContext.RemapHandler你指定的,但是如果另一HttpHandler电话RemapHandler(其中注册如ASP.NET MVC MvcHandlerPostResolveRequestCache)你IHttpModule将永远不会触发.这也许就是为什么IHttpHandler.Process从未被召唤过

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

routes.IgnoreRoute("your_path/{*pathInfo}");
Run Code Online (Sandbox Code Playgroud)

另外,请记住,使用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;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下使用a HttpHandlerFactory和之间的区别在于HttpModule后者允许您决定何时使用哪个IHttpHandler而不管ASP.NET IHttpHandler映射.有关MSDN的更多信息:HTTP处理程序和HTTP模块概述.