可以在不赋予每个控制器属性的情况下使用 AddApiVersioning() 吗?

Can AddApiVersioning() be used without attributing every controller?

我在我的 Asp.Net Web Api 2 api 中使用 config.AddApiVersioning() 在我的 WebApiConfig 中进行版本控制。我的每个控制器都装饰有类似 [Route("api/TestApi/v{version:apiVersion}/{action}/{id?}")].

的东西

我想删除大部分装饰,而是在我的 WebApiConfig:

中使用类似这样的东西
config.Routes.MapHttpRoute(
    "ApiControllerVersionActionId",
    "api/{controller}/v{version:apiVersion}/{action}/{id}",
    new { id = UrlParameter.Optional },
    new
    {
        // e.g., 1.0, 12.75
        apiVersion = @"^[0-9]+\.[0-9]+$",

        // only GUIDs or integers
        id = @"^(\{){0,1}(\(){0,1}[0-9a-fA-F]{8}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{12}(\)){0,1}(\}){0,1}$|^\d+$"
    }
);

我的问题:

我已经解决了这个问题,现在可以从我的控制器中删除所有 RouteAttribute

问题出在约束上。我已将我的 MapHttpRoute 修改为以下内容:

config.Routes.MapHttpRoute(
    "ApiControllerVersionActionId",
    "api/{controller}/v{apiVersion}/{action}/{id}",
    new { id = UrlParameter.Optional },
    new
    {
        apiVersion = new ApiVersionRouteConstraint(),

        // empty string, guid, or int
        id = @"^$|^(\{){0,1}(\(){0,1}[0-9a-fA-F]{8}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{12}(\)){0,1}(\}){0,1}$|^\d+$"
    }
);

我想我还要提到,无论路由方法如何(基于约定的基于属性的API Version Conventions,您都可以使用版本).有对命令式版本控制器的开箱即用支持,以及通过包含命名空间对版本进行约定。您还可以制定自己的约定来确定哪些 API 版本应用于控制器。

您将约定添加到配置中,如下所示:

options.Conventions.Add( new MyVersioningConvention() );

如果你想使用直接路由(又名属性路由),但又不想重复版本段完了,还有其他选择。您可以在 ASP.NET Web API 中使用以下任何方法:

  1. 扩展 RoutePrefixAttribute 并自动包含前缀(例如:ApiRoutePrefixAttribute
  2. 创建一个自定义 IRoutePrefix,它可能会通过属性应用,但不一定是
  3. 扩展并替换 DefaultDirectRouteProvider
  4. 实施自定义 IDirectRouteProvider

我希望能提供一些其他有用的解决方案