簡體   English   中英

Asp.Versioning.Http AmbiguousMatchException:請求與控制器上的多個端點匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM