0

我有一个 .NET WebApi 解决方案。我正在限制对 HTTPS 的访问,但有条件地允许 HTTP 流量。条件之一是所有 HTTP 请求都必须使用 HTTP POST 方法,传递x-http-method-override标头以提供预期的方法,以便可以正确路由请求。我已经配置了一个全局DelegatingHandler来验证所有传入的请求并在需要时执行重定向。

使用标准路由,一切都很好。当我配置 AttributeRouting 时,事情就出轨了。似乎 AttributeRouting 在DelegatingHandler修改请求之前尝试定位路由,导致路由不正确或 IIS 404 错误。有没有办法在 AttributeRouting 处理程序解析路由之前拦截路由?

更多信息:该项目托管在 IIS 上(非自托管)。我使用的 AttributeRouting 是 WebApi 2.0 中的。因此DelegatingHandler在 中定义App_Start

GlobalConfiguration.Configuration.MessageHandlers
    .Add(new MyCustomDelegateHandler());

AttributeRouting 配置简单,使用:

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

路由是使用属性定义的:

[HttpGet("api/test/v1/users")]
4

1 回答 1

1

为了清楚起见,有几个问题......这是Selfhost还是Webhost(IIS)场景?AttributeRouting你的意思是内置的 Web API 2 属性路由,而不是 TimMcCall 的属性路由 nuget 包......对吗?

Selfhost和Webhost之间发生路由匹配的时间一直存在差异。在 Selfhost 中,路由匹配发生消息处理程序运行之后,而 Webhost 路由匹配发生消息处理程序运行之前。

如果您的场景是 Webhost,那么我希望行为不会改变......但是如果您看到不同的行为,那么您能否分享您的路由配置(WebApiConfig.cs 和属性控制器/操作)的样子?

在 Webhost 中,要在路由匹配发生之前拦截请求,您可以创建一个 Owin 中间件,该中间件位于 Web API 接收请求之前。在此中间件中,您可以根据需要修改请求详细信息。

注意
根据上面帖子中的更新“更多信息”,在这似乎是一个问题的地方使用了 pre-RTM 位,而这不再是最终 RTM 位的问题。

于 2013-11-14T17:52:18.377 回答