8

WebAPIを使用してAPIを構築しています。私が狙っているのは、ルートを登録するときにWebAPIアプリが照会するAPIのバージョンごとに外部ライブラリを作成することですWebApiConfig

例: Api.v1Api.v2


versionこれらは同様の機能を共有しますが、渡されたヘッダーに基づいて、適切な API バージョンを選択します。

/{controller}/{action}-HTTP-HEADER: version=1にマップApi.v1.Controller/Action

/{controller}/{action}-HTTP-HEADER: version=2にマップApi.v2.Controller/Action


目標は、接頭辞を避けること/{ver}/{controller}/{action}です。同じ値を持つことはサポートされていないことはわかっていrouteTemplatesますが、ルートを特定の名前空間にバインドでき、制約が一致する解決に役立つ可能性があると考えました。

namespace Api.v1
{
    public static class Routing
    {
        public static void MapRoutes(HttpConfiguration config)
        {
            IHttpRoute r = config.Routes.MapHttpRoute(
                name: "",
                routeTemplate: "{controller}/{action}/{id}",
                defaults: new 
                {
                    id = RouteParameter.Optional, 
                    namespaces = new string[] { "Api.v1.Controllers" } 
                },
                constraints: new VersionConstraint(2)
            );
        }
    }
}

public class VersionConstraint : IRouteConstraint
{
    int _version;
    public VersionConstraint(int version)
    {
        _version = version;
    }

    public bool Match(
        HttpContextBase httpContext, 
        Route route, 
        string parameterName, 
        RouteValueDictionary values, 
        RouteDirection routeDirection)
    {
        int version;
        int.TryParse(httpContext.Request.Headers["version"], out version);
        return version == _version;
    }
}

for each ルートを挿入しようとしてnamespacesも、実際には役に立ちませんでした。プロパティはDataTokensnull で読み取り専用です。


私がやっていることをどのように行うか考えていますか?同じ名前の異なるコントローラに同じルート マップを持たせる方法はありますか?機能と名前空間は異なりますか?

4

2 に答える 2

8

HTTPヘッダーを使用したASP.NET Web APIサービスのバージョン管理をご覧ください。これは、HTTPヘッダーのプレセンスに基づいてルーティングする方法に関する質問に答えているようです。

既定のコントローラー セレクターを、HTTP ヘッダーに基づいて正しいコントローラーを選択するカスタムIHttpControllerSelectorに置き換えます。

于 2012-10-18T17:12:01.860 に答える
0

ASP.NET Web API: 名前空間を使用して Web API をバージョン管理する http://blogs.msdn.com/b/webdev/archive/2013/03/08/using-namespaces-to-version-web-apis.aspx

于 2014-09-18T19:37:24.837 に答える