【问题标题】:Attribute Routing changes WebAPI pipeline属性路由更改 WebAPI 管道
【发布时间】:2013-11-26 22:10:45
【问题描述】:

我有一个 .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")]

【问题讨论】:

  • 感谢您的更新...看起来您正在使用 Web API 2 的非 RTM 位,这可能存在您所说的问题。在 Web API 2 的 RTM 位中,您不能再像上面那样定义属性路由...请看这里:asp.net/web-api/overview/web-api-routing-and-actions/…
  • 看看。会告诉你进展如何。
  • 是的,更新库并从 HttpGet 更改为 Route 似乎可以解决此问题。介意用修复更新您的回复,我会接受吗?
  • 当然,我更新了我的答案...

标签: asp.net-web-api routes asp.net-web-api-routing attributerouting


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 根据this, official, poster,自托管和IIS 托管的请求处理没有区别。两种设置中的委派处理程序在路由启动之前运行。而且我观察到自托管(在工作中)和 IIS 托管(在家)的行为方式相同:委派处理程序在任何请求之前获得请求路由发生。您是否有任何示例项目可以重现您所说的内容?
  • 张贴者没有明确说明路由匹配实际发生的时间。我所说的一个简单的复制是:创建一个新的 Web API 项目,然后从 WebApiConfig.cs 中删除任何现有配置,然后创建一个简单的委派处理程序并具有类似 config.MessageHandlers.Add(new HandlerA()); config.Routes.MapHttpRoute("DefaultApi", "api/values", new { controller = "Values" });...当您提出请求时api/values,您应该看到处理程序被调用...但是当您发出像api/test 这样的请求时,处理程序永远不会被调用
  • 继续我之前的评论,因为在请求为 api/test 并且从未调用过处理程序的情况下,这表明在消息处理程序运行之前发生了路由匹配。
  • 同意。查看发布的内容,我认为在调用委托处理程序之后会发生路由匹配,但情况似乎并非如此。我在原始帖子中添加了一些澄清细节。
  • @Chris 和 Kiran:MVC 和 web api 路由可以混合使用。 VS 将默认 MVC 路由添加到新 Web api 项目的配置中,以迎合help area,这是您的 api 的基于 MVC 的“帮助页面”。会不会是这个默认的 MVC 路由把事情搞砸了?再说一次,海报似乎还暗示 OnActionExecuted 在发生异常时不会被触发,我最近发现它实际上确实如此......Web Api REST service exception handling issue
猜你喜欢
  • 2016-12-17
  • 1970-01-01
  • 2014-09-26
  • 2013-08-04
  • 2013-06-07
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多