【问题标题】:Can AddApiVersioning() be used without attributing every controller?可以在不归属每个控制器的情况下使用 AddApiVersioning() 吗?
【发布时间】:2020-07-03 02:27:40
【问题描述】:

我在我的 WebApiConfig 中使用 config.AddApiVersioning() 对我的 Asp.Net Web Api 2 api 进行版本控制。我的每个控制器都装饰有 [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+$"
    }
);

我的问题:

  • 这可能吗?
  • 有例子吗?我发现的大多数示例都装饰了所有控制器。

【问题讨论】:

    标签: asp.net-web-api2 aspnet-api-versioning


    【解决方案1】:

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

    问题在于约束。我已将 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+$"
        }
    );
    

    【讨论】:

    • 如果您想要基于约定的路由,这是正确的方法。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      相关资源
      最近更新 更多