asp.net webapi で CustomHttpControlSelector と AttributeRouting を使用して、API のバージョン管理を実現しようとしています。
私がやろうとしているのは、コントローラーのバージョンを名前空間で区別することです。
リクエストが /api/v2/foo/bar に対して行われた場合、一致させたい
namespace Web.Controllers.Api.v2
{
[RoutePrefix("foo")]
public class LongerThanFooController : ApiController
{
[HttpGet]
[Route("bar")]
public string BarFunction()
{
return "foobar";
}
}
}
しかし、RoutePrefix (/api/v2/foo) 属性で完全な URL を使用しないとわかるように、ルーティングが開始されず、呼び出すと null が返されます
request.GetRouteData().GetSubRoutes();
私の CustomHttpControlSelector で。すべてのコントローラーで /api/v2 を繰り返したくありません。
attributeRouting を削除し、次のような手動ルートを使用することにした場合
config.Routes.MapHttpRoute(
name: "DefaultVersionedApi",
routeTemplate: "api/v{version}/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional, version = Config.LatestVersion }
);
コントローラーと関数に名前を付ける柔軟性がすべて失われます。
この漠然とした状態から抜け出す方法はありますか?
注:CustomHttpControlSelectorの場合、http://aspnet.codeplex.com/SourceControl/changeset/view/dd207952fa86#Samples/WebApi/NamespaceControllerSelector/NamespaceHttpControllerSelector.csのコードを変更しました