我肯定只有我一个人,但在使用了多个源、方法和许多实例之后,我似乎连最简单的aspnet-api-versioning示例都无法工作。我一直在为不同版本的端点获取AmbiguousMatchExceptions。我做错了什么?为了让它发挥作用,我应该改变什么?
using Asp.Versioning;
using Microsoft.AspNetCore.Mvc;
internal class Program
{
private static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services
.AddApiVersioning()
.AddMvc();
var app = builder.Build();
app.MapControllers();
app.Run();
}
}
[ApiVersion("1.0"), Route("v{version:apiVersion}/hello")]
public class HelloV1Controller : ControllerBase
{
[HttpGet]
public string Get() => "v1";
}
[ApiVersion("2.0"), Route("v{version:apiVersion}/hello")]
public class HelloV2Controller : ControllerBase
{
[HttpGet]
public string Get() => "v2";
}发布于 2022-11-03 19:18:33
之所以发生这种情况,是因为设置不完整。它应该是:
builder.Services.AddApiVersioning().AddMvc();这些名称有意相似,但与一些人的看法相反,这并没有增加完整的MVC堆栈。API版本控制6.0添加了一个新的IApiVersioningBuilder,这样所有相关的扩展都可以分组在一起。6.0支持最小的API,这意味着不再依赖于MVC核心的任何部分。这就是AddApiVersioning()现在所做的。要添加MVC以支持控制器,就像它在以前的版本中那样工作,您必须调用AddMvc()。这使您在选择如何修改API时具有最大的灵活性。您甚至可以混合和匹配最小的API和控制器。
为了快速参考,以下是配置选项的技巧:
services.AddApiVersioning() // Core API Versioning services with support for Minimal APIs
.AddMvc() // API version-aware extensions for MVC Core
.AddApiExplorer() // API version-aware API Explorer extensions
.AddOData() // API versioning extensions for OData
.AddODataApiExplorer(); // API version-aware API Explorer extensions for OData显然,如果您没有使用apply或OData包,那么这些扩展就不适用了。
此外,每个控制器必须使用[ApiController]修饰,以便API版本控制可以消除API控制器和UI控制器之间的歧义,否则它们具有相同的基本类型。您还可以使用[assembly: ApiController]使项目中的所有控制器成为API控制器。
AddEndpointsApiExplorer()是完全不相关的。如果您没有使用最小的API,那么它就没有必要了。如果要添加OpenAPI来记录API,则需要添加API扩展。
https://stackoverflow.com/questions/74307741
复制相似问题