0

我正在使用config.AddApiVersioning()我的 WebApiConfig 对我的 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+$"
    }
);

我的问题:

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

2 回答 2

1

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

问题在于约束。我已将 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+$"
    }
);
于 2020-03-22T14:16:09.167 回答
0

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

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

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

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

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

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

于 2020-03-25T18:18:11.477 回答