API 版本控制读取版本,但即使指定了属性也无法将其与操作匹配

API Versioning reads version but can't match it with action even when attribute is specified

代码:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddApiVersioning(o =>
        {
            o.ApiVersionReader = new Microsoft.AspNetCore.Mvc.Versioning.QueryStringApiVersionReader();
        });
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMvc();
    }
}

[Route("/")]
[ApiVersion("1.0")]
public class V1Controller : ControllerBase
{
    [HttpGet("something")]
    public string Something() => "V1";
}

[Route("/")]
[ApiVersion("2.0")]
public class V2Controller : ControllerBase
{
    [HttpGet("something")]
    public string Something() => "V2";
}

要求:

irm https://localhost:44326/something?api-version=1.0

日志:

Microsoft.AspNetCore.Mvc.Routing.DefaultApiVersionRoutePolicy:Information: Multiple candidate actions were found, but none matched the requested service API version '1.0'. Candidate actions: WebApplication1.V1Controller.Something (WebApplication1)
WebApplication1.V2Controller.Something (WebApplication1)

因此它正确读取了版本,但未能将其与操作相匹配。

是一个错误吗?我做错了什么?

可能是

services.AddApiVersioning(options => {
options.AssumeDefaultVersionWhenUnspecified = true;
});


[ApiVersion("1.0")] // Add this
[ApiVersion("2.0")] // Add this
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
// This is used vor API version 1
public ActionResult<IEnumerable> Get()
{
return Get("v1");
}

// GET api/values
[HttpGet()]
[MapToApiVersion("2.0")]
public ActionResult<IEnumerable> Get(string param = "v2")
{
return new string[] { "value1", "value2", param };
}

// here the rest of the class
}

为每个控制器添加 [ApiController]

[ApiVersion("1.0")]
[ApiController]
[Route("/")]
public class V1Controller : ControllerBase
{
    [HttpGet("something")]
    public string Something() => "V1";
}

[ApiVersion("2.0")]
[ApiController]
[Route("/")]
public class V2Controller : ControllerBase
{
    [HttpGet("something")]
    public string Something() => "V2";
}

public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddApiVersioning(o =>
        {
            o.ApiVersionReader = new Microsoft.AspNetCore.Mvc.Versioning.QueryStringApiVersionReader();
            o.options.UseApiBehavior = false;
        });
    }