WebAPIを使用してAPIを構築しています。私が狙っているのは、ルートを登録するときにWebAPIアプリが照会するAPIのバージョンごとに外部ライブラリを作成することですWebApiConfig
例: Api.v1
とApi.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
も、実際には役に立ちませんでした。プロパティはDataTokens
null で読み取り専用です。
私がやっていることをどのように行うか考えていますか?同じ名前の異なるコントローラに同じルート マップを持たせる方法はありますか?機能と名前空間は異なりますか?