我遇到问题让Web API与基于子域的路由一起工作。简而言之,我已经找到了正确的控制器和方法,但子域中的数据标记没有被WebAPI拾取。ASP.NET Web API RTM和子域路由
我有这个在我的情况:
contoso.myapp.com
fabrikam.myapp.com
{tenant}.myapp.com
所有解决相同的ApiController,我希望能够提取{tenant}
令牌。
我使用的代码本文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" }
));
我的请求路由到正确的控制器。但是,租户数据令牌永远不会被填充(如果我做this.Request.GetRouteData()
我看到控制器和操作令牌而不是租户)。如果我在GetRouteData
上放置一个断点,它永远不会被调用。
我试着用反射器跟着代码路径,看看GetRouteData在HttpRouteCollection级别被调用的地方,但是看起来这个集合是空的。不确定如何桥接常规ASP.NET路由和WEb API路由之间的集成,但这让我感到困惑。
任何想法?
我现在用的解决方法是显式调用GetRouteData在Route
this.Request.GetRouteData().Route.GetRouteData(this.Request.RequestUri.ToString(), this.Request)
谢谢!只是好奇,RouteByPassingHandler的目的是什么? – woloski
'RouteByPassingHandler'似乎在自主主机场景中破坏路由(我使用自托管来测试我的控制器)。有关如何解决问题而不添加对自主主机程序集的引用并在添加处理程序之前检查'HttpSelfHostConfiguration'的任何想法? – georgiosd