2013-05-13 119 views
13

有什么方法可以从Web API上下文中运行的服务方法(控制器之外)静态获取路由值?例如,我可以做以下的ASP.NET MVC:Web API获取路由值

var mvcHandler = HttpContext.Current.Handler as MvcHandler; 
var routeValues = mvcHandler.RequestContext.RouteData.Values; 

我想找到这段代码的Web API相当于版本。

当我尝试调试示例Web API请求并查看HttpContext.Current.Handler时,它的类型为HttpControllerHandler,但此类型没有任何属性来访问路由数据。

编辑

要尽量帮助提供一些更多的信息。我想从中读取值的代码是在工厂类的内部,我为它构建了一个自定义对象。

+0

Kyle,请您为我们发布Web API版本的代码? – 2013-05-13 17:36:19

+0

这就是我试图找出:) – Kyle 2013-05-13 17:38:12

+0

你的意思是你'使用System.Web.Http; var handler = Http.Current.Handler',并发现它是HttpControllerHandler? – 2013-05-13 17:40:28

回答

10

我能找到一个解决方案,可以获得MVC请求或Web API请求的路由值。

HttpContext.Current.Request.RequestContext.RouteData 
18

您可以在HttpRequestMessage上使用GetRouteData()扩展。你需要包含System.Net.Http命名空间来获取它。

System.Web.Http.Routing.IHttpRouteData routeData = Request.GetRouteData(); 
+0

谢谢。看起来这可以在控制器内工作,但在控制器之外HttpContext.Current.Request不是HttpRequestMessage类型(并且不能被转换为它)。我应该在OP中更好地阐明这一点。 – Kyle 2013-05-13 18:00:58

+0

不,您可以在任何可以访问HttpRequestMessage的地方访问它。消息处理程序内例如:“公共类DelegateHandlerA:DelegatingHandler { 保护覆盖异步任务 SendAsync(HttpRequestMessage请求,的CancellationToken的CancellationToken) { System.Web.Http.Routing.IHttpRouteData的RouteData = request.GetRouteData(); HttpResponseMessage response = await base.SendAsync(request,cancellationToken); 返回响应; 012W} }' – 2013-05-13 18:05:53

+0

顺便说一句,GetRouteData()扩展会为WebHost(IIS)和SelfHost(其中HttpContext不可用)场景提供一致的体验。 – 2013-05-13 18:07:42