我正在尝试做一些事情简单和琐碎 - 或者至少我认为。
我正在尝试编写一个可以由我启动的每个微服务项目继承的基类。这个基类的重点是测试从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)。动作需要一个明确的HttpMethod 绑定Swagger 2.0
答案 0 :(得分:5)
使您的基本控制器抽象化。否则,它们作为可能路由到的控制器参与路由。虽然我真的很惊讶,基于控制器名称约定的路由仍然适用于以ControllerBase
而不仅仅是Controller
结尾的类,但是看起来ASP.NET Core会看到它们两者都命名为DevTest
,因此含糊不清。
您也可以将基本控制器重命名为BaseDevTestController
(即&#34; Base&#34; 之前&#34; Controller&#34;) ,然后将名称DevTest
和BaseDevTest
删除,消除了歧义。然而,它仍然是一个更好的想法,只是使它抽象,因为它应该是无论如何。您不希望某人实际上能够直接导航到您的基本控制器。