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

时间:2019-07-12 11:26:21

标签: c# asp.net-core asp.net-core-mvc versioning asp.net-core-2.2

代码:

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)

因此它可以正确读取版本,但无法将其与操作匹配。

是错误吗?我怎么了?

2 个答案:

答案 0 :(得分:1)

为每个控制器添加[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;
        });
    }

答案 1 :(得分:0)

可能是

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
}