1

MSDN 文档说:

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

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

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

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

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

4

1 回答 1

6

您可以HttpContext.RemapHandler按照您的指定使用,但是如果另一个HttpHandler调用(例如注册在RemapHandlerASP.NET MVC中),您将永远不会触发。这也许就是为什么从未被调用的原因。MvcHandlerPostResolveRequestCacheIHttpModuleIHttpHandler.Process

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

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

另外,请记住,使用 Visual Studio Web 开发服务器和 IIS6RemapHandler将无法正常工作。

下面是一个示例,说明如何根据 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;
}

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

于 2012-03-14T23:24:18.340 回答