MSDN文档说:
HttpContext.RemapHandler方法 - 允许您为请求指定处理程序。
我正在尝试将请求的处理从一个处理程序移动到另一个处理程序,具体取决于第一个处理程序中的条件。 HttpContext.RemapHandler方法似乎初始化第二个处理程序的实例但不调用HttpHandler.ProcessRequest方法;回复是空的。
HttpContext.RemapHandler方法是否按照我的想法执行 - 将处理转移到新的HttpHandler并调用HttpHandler.ProcessRequest方法?或者我应该使用其他方法,如另一种方法或HttpModule?
编辑: 事实证明我应该使用HTTPHandlerFactory。我现在的解决方案很好用。
那么HttpContext.RemapHandler究竟是什么?
答案 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;
}
在这种情况下使用HttpHandlerFactory
和HttpModule
之间的区别在于,后者允许您决定何时使用哪个IHttpHandler
而不管ASP.NET IHttpHandler
映射。有关MSDN的更多信息:HTTP Handlers and HTTP Modules Overview。