在我的Web API处理程序中,我需要获取与请求匹配的路径的名称。
public class CurrentRequestMessageHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var route = request.GetRouteData().Route;
//now what?
return base.SendAsync(request, cancellationToken);
}
}
答案 0 :(得分:8)
目前无法在Web API中检索路由的路由名称。您可以查看HttpRouteCollection
源代码here了解更多详情。如果您的方案肯定需要路由名称,则可以在路由的data tokens
中添加路由名称。 (请注意,当前属性路由不提供访问数据令牌的方法)
更新 - 2014年6月23日
通过属性路由领域的最新改进(5.2 RC),您可以执行以下操作,将路径名称插入数据令牌。
config.MapHttpAttributeRoutes(new CustomDefaultDirectRouteProvider());
public class CustomDefaultDirectRouteProvider : DefaultDirectRouteProvider
{
public override IReadOnlyList<RouteEntry> GetDirectRoutes(HttpControllerDescriptor controllerDescriptor,
IReadOnlyList<HttpActionDescriptor> actionDescriptors, IInlineConstraintResolver constraintResolver)
{
IReadOnlyList<RouteEntry> coll = base.GetDirectRoutes(controllerDescriptor, actionDescriptors, constraintResolver);
foreach(RouteEntry routeEntry in coll)
{
if (!string.IsNullOrEmpty(routeEntry.Name))
{
routeEntry.Route.DataTokens["Route_Name"] = routeEntry.Name;
}
}
return coll;
}
}
像这样访问它:
reequest.GetRouteData().Route.DataTokens["Route_Name"]
答案 1 :(得分:1)
回答这个问题可能有点晚了,但我发现自己处于相同的情况(即我需要生成一个URL而没有相应的IHttpRoute名称)。但是,您可以使用Route和HttpRequestMessage生成一个URL。
var parameters = new Dictionary{{"id" , 123}, {HttpRoute.HttpRouteKey, true}};
var path = Route.GetVirtualPath(request, parameters);
var uri = path.VirtualPath;
重要的是将HttpRoute.HttpRouteKey添加到参数中,如果未使用此值,则GetVirtualPath返回null。 请参阅HttpRoute.cs
中的代码// Only perform URL generation if the "httproute" key was specified. This allows these
// routes to be ignored when a regular MVC app tries to generate URLs. Without this special
// key an HTTP route used for Web API would normally take over almost all the routes in a
// typical app.
if (values != null && !values.Keys.Contains(HttpRouteKey, StringComparer.OrdinalIgnoreCase))
{
return null;
}