Web API - 处理所有请求和错误

Mig*_*Mig 5 c# asp.net iis asp.net-web-api2

阅读完以下问题后:

测试未通过IIS 请求过滤(特别是查询字符串长度)的请求并希望执行以下操作:

  • 防止 IIS 劫持任何错误
  • Web API / ASP.Net 中的钩子用于处理这些错误

web.config 中的IIShttpErrors部分设置如下:

 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <httpErrors existingResponse="PassThrough" />
 </system.webServer>
Run Code Online (Sandbox Code Playgroud)

当遇到太长的请求时,我从 Web API 返回的响应如下:

HTTP/1.1 404 Not Found
Date: Thu, 09 Apr 2015 10:58:34 GMT
Server: Microsoft-IIS/7.5
Content-Length: 0
Run Code Online (Sandbox Code Playgroud)

如果删除httpErrors配置部分,我们将返回 IIS 错误消息 (404.15)。为了尝试解决路由未被命中的问题,我尝试定义一个捕获所有路由来处理任何未知的 URL:

config.Routes.MapHttpRoute(
    name: "CatchAll",
    routeTemplate: "{*url}",
    defaults: new { controller = "Error", action = "NotFound"});
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个控制器动作从未被击中。之后,我想我应该尝试 Web API 跟踪模块来查看是否有任何Web API 管道被命中,而不是调试窗口中没有显示任何内容。

我可以看到请求命中应用程序的唯一位置如下Global.asax

protected void Application_PreSendRequestHeaders()
{
    Response.Headers.Remove("Server");
}
Run Code Online (Sandbox Code Playgroud)

如果我现在重新运行请求,标头将被正确删除,并查看应用程序中的请求属性,一切似乎都已正确设置,甚至查询字符串也被正确保留。

我有什么遗漏的吗?我已经有一个在其他地方使用的全局异常处理程序,以及包装所有响应的委托处理程序,但不幸的是这些都没有被命中。

有没有办法捕获这些请求并将其通过 Web API 处理,或者禁用请求过滤会更好吗?