5
var constraintResolver = new DefaultInlineConstraintResolver()
{
    ConstraintMap =
    {
        ["apiVersion"] = typeof( ApiVersionRouteConstraint )
    }
};
                
config.MapHttpAttributeRoutes(constraintResolver);
config.AddApiVersioning(o => o.AssumeDefaultVersionWhenUnspecified = true);


[ApiVersion("2.05")]
[RoutePrefix("api/v{version:apiVersion}/ger")]
public class caGerController
[Route("~/api/ger/getDetail")]
[Route("getDetail")]
 GetGerData


[ApiVersion("1")]
[RoutePrefix("api/v{version:apiVersion}/gerDetail")]

public class caGerDetailsController
caGerController
[Route("~/api/gerDetail/getDetail")]
[Route("getDetail")]
 GetGerData
   
>>  GetGerData

结果:

  1. 两个 URL 都与 v1 版本 ROUTE 一起使用。

  2. 第二个 URL 也适用于 v1 和直接没有 v1 路由,即 [Route("~/api/gerDetail/getDetail")]

  3. 问题:第一个 URL 仅适用于 v1,它不适用于像“[Route("~/api/ger/getDetail")]”这样的直接路由,并出现如下错误:

    "Error": { "Code": "ApiVersionUnspecified", "Message": "需要 API 版本,但未指定。" }

如何解决这个问题?当我从 2.05 更改为 1.0 时,它可以工作,但 2.0 或 2.05 都不起作用。是否需要单独的文件夹?

4

2 回答 2

10

发生ApiVersionUnspecified是因为默认情况下所有路由都需要显式 API 版本。您使用以下方式选择退出此行为:

options.AssumeDefaultVersionWhenUnspecified = true

此设置意味着当客户端不提供默认 API 版本时,将假定其为默认 API 版本。默认值为:

options.DefaultApiVersion // equals 1.0 by default

当您使用 URL 段版本控制方法时,您不能有两个不同的控制器,它们都是未版本化的路由。没有 API 版本的路由只能映射到单个控制器。由于默认值为“1.0”,并且您有一个带有未版本化路由的控制器,因此它将始终匹配。

于 2018-03-26T00:43:02.520 回答
1

通过添加 API 版本控制,默认行为是它使用 QueryString 版本控制。

   config.AddApiVersioning(cfg => {});

api版本=1.0

要指定版本,您可以在末尾添加查询字符串参数api-version=1.0 。

例子:

http://localhost:6600/api/test?api-version=1.0

您可以像这样更改版本:

protected void Application_Start()
    {
      AreaRegistration.RegisterAllAreas();
      GlobalConfiguration.Configure(WebApiConfig.Register);
...

    public static void Register(HttpConfiguration config)
    {
       ...
      config.AddApiVersioning(cfg =>
      {
         cfg.DefaultApiVersion = new ApiVersion(1,1);
      });

因此,您可以像这样更改版本:

http://localhost:6600/api/test?api-version=1.1

通过添加AssumeDefaultVersionWhenUnspecified,您不必指定版本。

  config.AddApiVersioning(cfg =>
  {
     cfg.DefaultApiVersion = new ApiVersion(1,1);
     cfg.AssumeDefaultVersionWhenUnspecified = true;
  });

这将起作用:http://localhost:6600/api/test

您还可以添加ReportApiVersions

  config.AddApiVersioning(cfg =>
  {
     cfg.DefaultApiVersion = new ApiVersion(1,1);
     cfg.AssumeDefaultVersionWhenUnspecified = true;
     cfg.ReportApiVersions = true;
  });

响应将有一个新的标头api-supported-versions,它指定了他们所做的调用支持哪些版本。

于 2020-10-08T19:02:33.637 回答