【问题标题】:An API version is required, but was not specified. webapi需要 API 版本,但未指定。网页API
【发布时间】:2018-08-31 02:57:28
【问题描述】:
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 路由的直接 URL,即 [Route("~/api/gerDetail/getDetail")]

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

    “错误”:{ "代码": "ApiVersionUnspecified", “消息”:“需要 API 版本,但未指定。” }

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

【问题讨论】:

    标签: asp.net-web-api routes asp.net-web-api-routing api-versioning


    【解决方案1】:

    ApiVersionUnspecified 发生是因为 all 路由默认需要明确的 API 版本。您使用以下方式选择退出此行为:

    options.AssumeDefaultVersionWhenUnspecified = true
    

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

    options.DefaultApiVersion // equals 1.0 by default
    

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

    【讨论】:

    • 如何指定版本?
    • 如何指定 API 版本取决于您使用的版本控制风格。在原始问题中,正在使用 URL 分段方法。这意味着请求以api/v1/ger 的形式指定API 版本。使用这种版本控制风格,如果你想要一个 default 版本,那么你需要第二条路线(例如api/ger)。设置路由和options.AssumeDefaultVersionWhenUnspecified = true 后,路由api/v1/gerapi/ger 将执行相同的实现。
    【解决方案2】:

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

       config.AddApiVersioning(cfg => {});
    

    api-version=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,它指定了他们所做的调用支持哪些版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-31
      • 1970-01-01
      • 2013-09-04
      • 2011-02-07
      • 1970-01-01
      • 2019-08-11
      • 2019-08-17
      • 1970-01-01
      相关资源
      最近更新 更多