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