3

我已經構建了一個自定義的HttpHandler,當負載均衡器請求特定資源時就會發佈一個狀態頁面。HttpHandler被路由器忽略

更多背景:它不能是一個控制器,因爲我需要能夠與其他程序集共享它,並且公司編碼策略不允許其他程序集的控制器。 另外,我不能使用委託處理程序,因爲我不想通過添加全局消息處理程序來影響管道。

所以我得在web.config如下:

<system.web> 
... 
    <httpHandlers> 
     <!-- Status Page--> 
     <add verb="GET" path="*" type="Web.Api.Framework.StatusPageHandler, Web.Api.Framework" /> 
    </httpHandlers> 
... 
</system.web> 
<system.webServer> 
... 
    <handlers> 
     <clear/> 
     <add name="StatusPageHandler" path="*" verb="GET" type="Web.Api.Framework.StatusPageHandler, Web.Api.Framework" /> 
    </handlers> 
... 
</system.webServer> 

當我嘗試訪問處理器(http://foo.bar/status)失敗有404如果我刪除默認控制器的資源映射(從global.asax),那麼它的作品。即沒有在Global.asax中下面的語句它的工作原理:

routes.MapRoute("Default", "{controller}", null, null); 

我在爲它做工作的一個網址跌跌撞撞:http://foo.bar/status/XXX,但幾乎理想的 - 我們不希望有延長的URL那「醜陋」的方式。

我該如何讓它起作用?

+0

你能否解釋一下「我不能用委託處理程序,因爲我不想加入一個全球性的消息處理影響管道」?通過添加一個HttpHandler來影響管道,只是在不同的地方。 –

+0

夠公平的。我的理解不對。我認爲web配置定義將是實現這一目標的最有效方式,並且框架將決定使用我的處理程序。 – CarllDev

回答

2

讓它工作的一種方法。像這樣改變Web.Config。

<add name="StatusPageHandler" path="status" verb="GET" 
    type="Web.Api.Framework.StatusPageHandler, Web.Api.Framework" /> 

在Global.asax(RouteConfig.cs?)中添加該行以忽略此路由。確保在routes.MapRoute之前添加此行。

routes.IgnoreRoute("status");

+0

添加routes.IgnoreRoute(「status」);對於http://foo.bar/status來說這行足夠了。 我有一個標誌來指示是否顯示診斷信息 - http://foo.bar/status/diag。即使添加了忽略之後,這仍然不起作用,但是當我添加routes.IgnoreRoute(「status/diag」); 感謝您的幫助@Badri – CarllDev

+0

這對我來說非常合適。在WebApi2中,忽略路由需要兩個參數(名稱和路徑),所以它應該是'routes.IgnoreRoute(「myroutename」,「status」);'還要注意webconfig行放在'system.webServer/handlers' – paqogomez