2012-03-01 48 views
1

MSDN文檔說:HttpContext.RemapHandler是否應該更改哪個處理程序處理請求?

HttpContext.RemapHandler方法 - 使您能夠爲請求指定處理程序。

我試圖將請求的處理從一個處理程序移動到另一個處理程序,具體取決於第一個處理程序中的條件。 HttpContext.RemapHandler方法似乎初始化第二個處理程序的實例,但不調用HttpHandler.ProcessRequest方法;響應是空的。

HttpContext.RemapHandler方法是否執行我認爲應該的操作 - 將處理轉移到新的HttpHandler並調用HttpHandler.ProcessRequest方法?或者我應該使用另一種方法,如另一種方法或HttpModule?編輯: 原來我應該使用HTTPHandlerFactory。我現在有很好的解決方案。

那麼HttpContext.RemapHandler到底是什麼?

回答

6

您可以使用HttpContext.RemapHandler爲你指定的,但是如果另一HttpHandler電話RemapHandler(例如ASP.NET MVC這PostResolveRequestCache註冊MvcHandler)您IHttpModule將永遠不會觸發。這也許是爲什麼IHttpHandler.Process從未被調用。

如果這是你的問題,你可以簡單地定義路由在MvcApplication.RegisterRoutes忽略這樣的:

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

另外請記住,使用Visual Studio的Web開發服務器和IIS6,RemapHandler將無法​​正常工作。

這裏是被激活,並且仍然能夠訪問會話如何選擇重新映射基於與否綜合管線處理程序的正確方法的例子:

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

+0

明確的答案,尤其是有關mvc處理程序的部分!日Thnx! – 2013-01-25 12:10:12

+0

如果應用了.NET 2.0 Service Pack 2,RemapHandler將在PostAuthorizeRequest中正常工作。 – 2014-09-11 18:44:33