REST API 控制器名称已丢弃(忽略)

REST API controller name discarded (ignored)

在 REST API 项目 dotnet Core 5.0 中,我有两个控制器:MyAController 和 MyBController,分别位于 类。它们派生自 MediatorApiController,后者派生自 ControllerBase。除了它们管理的实体 (CRUD) 之外,它们基本上是相同的。当我键入 https://localhost:5001/api 时,它会转到 MyAController 中的 [HttpGet("/{lang}")] 相应方法并显示对象 {lang}='api' ?? .

如果我输入 https://localhost:5001/api/MyA/1 或 https://localhost:5001/api/MyB/1 我收到一个错误 Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: 请求匹配多个端点 MyAController.Get MyBController.Get ???

有人可以帮忙吗? 我确实使用了 edi.routedebugger,但它没有达到目的(错误 500),如果我显示控制器,它们都会正确显示。

 public class AController : MediatorApiController
 public class BController : MediatorApiController
 public class MediatorApiController : ControllerBase

 
 [Route("api/[controller]")]
 [ApiController]
 public class MyAController : MediatorApiController
 {
    [HttpGet("/{lang}")]
    public async Task<ActionResult<List<AlimentDto>>> GetAll(string lang)
    {
        return await Mediator.Send(new GetAllAlimentsQuery(lang));
    }

    [HttpGet("/{id}/{lang}")]
    public async Task<ActionResult<AlimentDto>> Get(int id, string lang)
    {
      return await Mediator.Send(new GetAlimentByIdQuery { Id = id, Lang = lang });
    }

}

startup.cs 文件:

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseSwaggerUi3();
                app.UseRouteDebugger();
            }
            //app.UseCors(options => options.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());

            app.UseOpenApi();
            app.UseHttpsRedirection();

            app.UseRouting();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

尝试把“/”去掉,改成

 [HttpGet("{lang}")]
public async Task<ActionResult<List<AlimentDto>>> GetAll(string lang)

对于 lang=en 你的 url 应该是

../api/MyAControlle/en

但我更喜欢并推荐使用完整的路由属性

 [Route("~/api/MyAControlle/GetAll/{lang}]
public async Task<ActionResult<List<AlimentDto>>> GetAll(string lang)