我在让 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
显式调用 GetRouteDatathis.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/