asp.net-web-api - ASP.NET Web API RTM 和子域路由

标签 asp.net-web-api asp.net-mvc-routing

我在让 Web API 与基于子域的路由一起工作时遇到问题。简而言之,我正在使用正确的 Controller 和方法,但是来自子域的数据 token 没有被 WebAPI 获取。

我在我的场景中有这个:

contoso.myapp.com
fabrikam.myapp.com
{tenant}.myapp.com

全部解析为相同的 ApiController,我希望能够提取 {tenant} token 。

我使用了本文中的代码http://blog.maartenballiauw.be/post/2012/06/18/Domain-based-routing-with-ASPNET-Web-API.aspx

但是,从撰写本文到 ASP.NET Web Api 退出测试阶段之间,似乎发生了一些变化。文中代码依赖RouteTable.Routes而在 Web API 上的路由是通过 HttpConfiguration.Routes 配置的这是一个 HttpRouteCollection而不是通常的 RouteCollection (它实际上源自 RouteCollection)。

所以我将代码更改为派生自 HttpRoute而不是 Route .这是代码:

https://gist.github.com/3766125

我配置了这样的路由
 config.Routes.Add(new HttpDomainRoute(
            name: "test",
            domain: "{tenant}.myapp.com",
            routeTemplate: "test",
            defaults: new { controller = "SomeController", action = "Test" }
        ));

我的请求被路由到正确的 Controller 。但是,租户数据 token 永远不会被填充(如果我这样做 this.Request.GetRouteData() 我会看到 Controller 和操作 token ,但没有看到租户)。如果我在 GetRouteData 上设置断点它永远不会被调用。

我尝试使用反射器跟踪代码路径,并查看在 HttpRouteCollection 级别调用 GetRouteData 的位置,但似乎该集合枚举为空。不确定常规 ASP.NET 路由和 WEB API 路由之间的集成是如何桥接的,但这让我感到困惑。

有任何想法吗?

我现在使用的解决方法是通过 Route 显式调用 GetRouteData
this.Request.GetRouteData().Route.GetRouteData(this.Request.RequestUri.ToString(), this.Request)

最佳答案

感谢您报告问题。我在 https://github.com/woloski/AspNetWebApiWithSubdomains 使用了你的复制品并做了一些调试。

这就是它发生的原因。 HttpDomainRoute.GetRouteData没有被调用,因为它被一个名为 HttpWebRoute 的内部类包装了在 Web API 中。当您使用 config.Routes.Add添加自定义路由的方法,而不是调用 HttpDomainRoute.GetRouteData ,它会简单地调用 System.Web.Routing.Route's GetRouteData 的实现.这就是为什么您会看到除租户之外的其余参数都被正确映射。

我想不出任何简单的解决方法。我可以在位于 http://aspnetwebstack.codeplex.com/ 的 codeplex 站点上提交问题。跟踪此问题。

关于asp.net-web-api - ASP.NET Web API RTM 和子域路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12544150/

相关文章:

asp.net-mvc-4 - 将查询字符串传递给RedirectToRouteResult(在 Controller 和操作旁边)

c# - 如何解析 MultipartFormDataContent

c# - ASP.Net WebApi Controller 应该返回 204 而不是 null [HttpResponseMessage]

c# - .NET WebAPI 中的 POST 对象

asp.net-mvc - 包含 <space> 和正斜杠的路由

c# - 我怎样才能得到 Controller 操作的 MethodInfo,它将根据请求被调用?

encryption - Bearer token (OAuth2) 是如何创建的?

.net - MVC6 的 VersionedRoute 属性实现

asp.net-mvc - MVC 路由 Html.ActionLink 使用 ?id=1 而不是/id 创建 URL

asp.net-mvc - 如何将查询字符串映射到 MVC 中的操作方法参数?