代码:
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)
因此它可以正确读取版本,但无法将其与操作匹配。
是错误吗?我怎么了?
答案 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
}