[英]Asp.Versioning.Http AmbiguousMatchException: The request matched multiple endpoints on controllers
我正在嘗試使用 Asp.Versioning.Http package 版本 6.4.0 在我的控制器上實現基於 header 的版本控制它應該在這里非常簡單但是我得到AmbiguousMatchException: The request matched multiple endpoints
exception
這是我的程序 class
我的控制器是這樣定義的:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddApiVersioning(options => {
// options.ApiVersionReader = new HeaderApiVersionReader("api-version");
options.DefaultApiVersion = new ApiVersion(1.0);
options.AssumeDefaultVersionWhenUnspecified = true;
options.ReportApiVersions = true;
}).EnableApiVersionBinding();
builder.Services.AddMvc();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
// app.UseSwagger();
//app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.MapHealthChecks("/health/live");
app.MapControllers();
app.Run();
namespace Things.Service.Controllers.V1
{
[ApiController]
[ApiConventionType(typeof(DefaultApiConventions))]
[Route("[controller]")]
[Asp.Versioning.ApiVersion(1.0)]
public class ThingsController : ControllerBase
{
// controller logic
}
}
namespace Things.Service.Controllers.V2
{
[ApiController]
[ApiConventionType(typeof(DefaultApiConventions))]
[Route("[controller]")]
[Asp.Versioning.ApiVersion(2.0)]`your text`
public class ThingsController : ControllerBase
{
// controller logic
}
}
我得到這個例外:
Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: The request matched multiple endpoints. Matches:
Things.Service.Controllers.V2.ThingsController.GetAllAsync (Things.Service)
Things.Service.Controllers.V1.ThingsController.GetAllAsync (Things.Service)
發生這種情況是因為您缺少AddMvc
。 別被名字騙了,這增加了 MVC 核心,而不是完整的 MVC 堆棧。 從6.0
開始,新設置以IApiVersioningBuilder
為中心,以便所有設置都在一個地方,並且希望更容易遵循。 如果您來自較早的版本(例如 <= 5.x
),這可能會讓您大吃一驚。 此更改是必要的,因為AddApiVersioning
現在是Minimal APIs的基礎,它不包括 MVC Core 或 controller 支持。 AddMvc
添加了這些功能。
services
.AddApiVersioning() // Asp.Versioning.Http : Core services and Minimal APIs
.AddMvc() // Asp.Versioning.Mvc : MVC Core
.AddApiExplorer() // Asp.Versioning.Mvc.ApiExplorer : API Explorer
.AddOData() // Asp.Versioning.OData : OData support
.AddODataApiExplorer(); // Asp.Versioning.OData.ApiExplorer : OData API Explorer
由於您使用的是 MVC 核心和控制器,因此不需要EnableApiVersionBinding
。 MVC Core 支持Model Binders 。 AddMvc
將注冊所有這些服務。 如果你想在你的 controller 操作中接收傳入的ApiVersion
,你只需要添加一個ApiVersion
類型的參數和你選擇的名稱。 例如:
namespace Things.Service.Controllers.V1
{
[ApiVersion(1.0)]
[ApiController]
[ApiConventionType(typeof(DefaultApiConventions))]
[Route("[controller]")]
public class ThingsController : ControllerBase
{
[HttpGet]
public IActionResult Get(ApiVersion version) => Ok();
}
}
最小 API無法支持這種類型的 model 綁定。 EnableApiVersionBinding
提供了一種使其工作的方法。 如果你添加了它,它不會傷害任何東西,但這是不必要的。
最后,您似乎在命名空間中包含了版本號。 如果這確實是您的設置,您可以考慮使用VersionByNamespaceConvention
。 這將不需要用[ApiVersion]
裝飾控制器。 API 版本將派生自名稱空間本身。 有關其他詳細信息,請參閱Version By Namespace Convention文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.