8

在我的 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);
    }
}
4

2 回答 2

8

目前无法在 Web API 中检索路由的路由名称。您可以在此处HttpRouteCollection查看源代码以获取更多详细信息。如果您的方案肯定需要路由名称,您可以在路由中添加路由名称。(请注意,当前属性路由不提供访问数据令牌的方法)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"]

于 2013-11-08T19:01:10.363 回答
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;
}
于 2014-02-26T14:28:23.073 回答