4

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のコードを変更しまし

4

1 に答える 1