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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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();
    }
}

我希望用它作为:

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

不幸的是,它产生了这个错误:

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绑定

答案

使您的基本控制器抽象化。否则,它们作为可能路由到的控制器参与路由。虽然我有点惊讶,老实说,基于控制器名称约定的路由仍然适用于以ControllerBase而不仅仅是Controller结尾的类,看起来ASP.NET核心将它们视为命名为DevTest,因此不明确。

您可以选择将基本控制器重命名为BaseDevTestController(即“Controller”之前的“Base”),然后将名称设为DevTestBaseDevTest,从而消除这种不确定性。然而,它仍然是一个更好的想法,只是使它抽象,因为它应该是反正。您不希望有人实际上能够直接导航到您的基本控制器。

以上是关于在ASP.Net Core中避免“请求匹配多个操作导致歧义”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 中获取 HttpContext.Current? [复制]

如何在ASP.NET Core 中使用IHttpClientFactory

用工厂模式解决ASP.NET Core中依赖注入的一个烦恼

解决ASP.NET Core在Task中使用IServiceProvider的问题

ASP.NET Core中如何限制响应发送速率(不是调用频率)

如何让asp.net core mvc发布时候不编译cshtml视图