Asp.net 在Web API中获取匹配的路由名称

Asp.net 在Web API中获取匹配的路由名称,asp.net,asp.net-web-api,Asp.net,Asp.net Web Api,在我的Web API处理程序中,我需要获取与请求匹配的路由的名称 public class CurrentRequestMessageHandler : DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var route

在我的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);
    }
}
公共类CurrentRequestMessageHandler:DelegatingHandler
{
受保护的覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
var route=request.GetRouteData().route;
//现在怎么办?
返回base.sendaync(请求、取消令牌);
}
}

目前无法在Web API中检索路由的路由名称。有关更多详细信息,请查看
HttpRouteCollection
源代码。如果场景中确实需要路由名称,则可以在路由的
数据标记中插入路由名称。(请注意,当前属性路由不提供访问数据令牌的方法)

更新-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;
    }
}
config.maphttpAttribute路由(新的CustomDefaultDirectRouteProvider());
公共类CustomDefaultDirectRouteProvider:DefaultDirectRouteProvider
{
公共覆盖IReadOnlyList GetDirectRoutes(HttpControllerDescriptor controllerDescriptor,
IReadOnlyList操作描述符,IInlineConstraintResolver(约束求解器)
{
IReadOnlyList coll=base.GetDirectRoutes(controllerDescriptor、ActionDescriptor、constraintResolver);
foreach(coll中的RouteEntry RouteEntry)
{
如果(!string.IsNullOrEmpty(routeEntry.Name))
{
routeEntry.Route.DataTokens[“Route_Name”]=routeEntry.Name;
}
}
返回coll;
}
}
像这样访问它:

reequest.GetRouteData().Route.DataTokens[“Route_Name”]

回答这个问题可能有点晚了,但我发现自己也遇到了同样的情况(即我需要生成一个URL,而没有相应的IHttpRoute名称)。但是,您可以仅使用路由和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。 请参见中的代码


路由名称可能仅在可从web配置访问的路由集合中可用。不确定如何通过授权处理程序访问配置。@MarjanVenema我可以从GlobalConfiguration.configuration.Routes获得配置,但我如何在那里找到我的路由?我猜它不是同一个对象,不喜欢基于路由模板进行搜索。即使我在路由的集合中找到了它-其中的对象是IHttpRoute,它不公开任何名称属性。也不确定,但如果它们是在选择控制器和操作方法时请求(IIUC)从路由集合将其添加到其属性集合中的同一个对象,我也不会感到惊讶。我想说,在集合中查找路由时,假设它引用的是同一个实例(毕竟是一个接口),然后看看你得到了什么/你是如何通过的(或日志信息)。你能提供更多关于你的场景的详细信息吗?好奇的是,你为什么需要当前路由的名称?目前您无法在Web API中检索给定路由的路由名称…@KiranChalla-您100%确定没有办法吗?如果是-将其作为答案发布,并附上一些证据/解释,我将接受。我的场景很复杂-我有一个IOC,其中包含一些生成超媒体链接的对象/工厂。在收到请求时,我需要在IOC中注册一些实例,这些实例将能够使用URLHelper类生成这些链接,该类需要路由名称来生成链接。如果有人正在寻找如何使用Web API 2.1在
WebApiConfig
中添加
DataTokens
,请参阅。
// 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;
}