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

これに答えるには少し遅いかもしれませんが、私は同じ状況に陥っていることに気付きました (つまり、対応する IHttpRoute 名がなくても URL を生成する必要があります)。ただし、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 に答える