避免ASP.Net Core中的“请求匹配的多个操作导致歧义”错误

Kei*_*ows 6 c# routes asp.net-core

我正在尝试做一些简单琐碎的事情-至少我认为。

我正在尝试编写一个基类,该基类可以由我启动的每个微服务项目继承。该基类的重点是测试从HTTP一直到SQL的连通性。PROD中未启用它。

这是(简单的)基类之一:

public class DevTestControllerBase: ApiControllerBase
{
    public DevTestControllerBase(IHostingEnvironment env, IConfiguration configuration = null, IMediator mediator = null) : base(env, configuration, mediator)
    {
    }


    [HttpGet]
    public IActionResult Get()
    {
        var response = Mediator.Send(new QueryGet());
        return Ok(response.Result);
    }

    [HttpGet("{id}", Name = "Get")]
    public IActionResult Get(Guid id)
    {
        var response = Mediator.Send(new QueryGetById(id));
        return Ok(response.Result);
    }

    [HttpPost]
    public async Task<IActionResult> Post([FromBody]DevTestModelBinding value)
    {
        if (!ModelState.IsValid)
            return BadRequest(ModelState);

        var response = await Mediator.Send(new CommandPost(value));
        return Created("Get", new { id = response });
    }

    [HttpPut("{id}")]
    public IActionResult Put(Guid id, [FromBody]DevTestModelBinding value)
    {
        if (!ModelState.IsValid)
            return BadRequest(ModelState);

        Mediator.Send(new CommandPut(id, value));
        return Ok();
    }

    [HttpDelete("{id}")]
    public IActionResult Delete(Guid id)
    {
        Mediator.Send(new CommandDelete(id));
        return Ok();
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望将其用作:

[Produces("application/json")]
[Route("api/DevTest")]
public class DevTestController : DevTestControllerBase
{
    public DevTestController(IHostingEnvironment env, IConfiguration configuration, IMediator mediator) : base(env, configuration, mediator) { }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,它改为产生此错误:

AmbiguousActionException:多个动作匹配。以下操作与路线数据匹配,并且满足所有约束:

MyNamespace.Providers.WebApi.Features.DevTest.DevTestController.Get(MyNamespace.Providers.WebApi)MyNamespace.Infrastructure.Web.Controllers.DevTestControllerBase.Get(MyNamespace.Infrastructure.Web)

而且由于我想使用Swagger,因此在尝试到达Swagger端点时也会出现此错误:

执行请求System.NotSupportedException:操作的HTTP方法不明确-MyNamespace.Providers.WebApi.Features.DevTest.DevTestController.Get(MyNamespace.Providers.WebApi)时,发生未处理的异常。动作需要Swagger 2.0的显式HttpMethod绑定

Chr*_*att 7

使您的基本控制器抽象。否则,它们将作为可能的控制器参与路由。坦白地说,尽管我有些惊讶,但基于控制器名称约定的路由仍然可以使用以结尾的类ControllerBase而不是just 起作用Controller,这似乎使ASP.NET Core都将它们视为named DevTest,因此模棱两可。

您可能也可以将基本控制器重命名为类似的名称BaseDevTestController(即 “ Controller” 之前用“ Base” 重命名),然后将其命名为DevTestBaseDevTest,从而消除歧义。但是,将其抽象还是一个更好的主意,因为无论如何应该如此。您不希望某人实际上能够直接导航到您的基本控制器。