API版本是必需的,但未指定。的WebAPI

时间:2018-03-21 20:08:48

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

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路由的直接路由,即[路由("〜/ api / gerDetail / getDetail")]

3)问题:第一个URL仅适用于v1,而不适用于直接路由,例如" 〔路线("〜/ API / GER / getDetail&#34)]" 并收到如下错误:

"Error": {
        "Code": "ApiVersionUnspecified",
        "Message": "An API version is required, but was not specified."
}

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

2 个答案:

答案 0 :(得分:2)

ApiVersionUnspecified 是因为所有路由默认需要显式API版本。您可以使用以下选项退出此行为:

options.AssumeDefaultVersionWhenUnspecified = true

此设置表示当客户端未提供默认API版本时,将采用默认API版本。默认值为:

options.DefaultApiVersion // equals 1.0 by default

使用网段版本控制方法时,您不能拥有两个不同的无版本路径的控制器。没有API版本的路由只能映射到单个控制器。由于默认值为" 1.0"并且你有一个带有无版本路线的控制器,这是一个永远匹配的路径。

答案 1 :(得分:0)

通过添加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 ,该标头指定了其调用所支持的版本。