【问题标题】:Multiple actions matched. The following actions matched route data and had all constraints satisfied多个动作匹配。以下操作匹配路线数据并满足所有约束
【发布时间】:2018-08-12 14:51:40
【问题描述】:

我正在尝试设计 API 版本控制,但出现以下错误

多个动作匹配。以下操作匹配路线数据和 满足所有约束

我不想复制所有控制器方法,而是覆盖任何已更改但未更改的导致错误的内容。这是我正在尝试的不好的做法吗?我的问题有什么解决办法吗?

[ApiVersion( "1.0" )]
[AllowAnonymous]
[Route("api/v{api-version:apiVersion}/[controller]")]
public class HeartbeatController : Controller
{
    [AllowAnonymous]
    [HttpGet, MapToApiVersion("1.0")]
    public virtual IActionResult Beat()
    {
        return Ok(DateTime.Now.ToString("HH:mm:ss"));
    }

    [AllowAnonymous]
    [HttpGet, MapToApiVersion("0.9")]
    public virtual IActionResult Get()
    {
        return Ok(Environment.MachineName);
    }
}


[ApiVersion("2.0")]
[AllowAnonymous]
[Route("api/v{api-version:apiVersion}/[controller]")]
public class HeartbeatController : V1.Controllers.HeartbeatController
{
    [AllowAnonymous]
    [HttpGet]
    public override IActionResult Get()
    {
        return Ok("this is version 2 " + Environment.MachineName);
    }
}

【问题讨论】:

    标签: c# asp.net-core-2.0 api-versioning


    【解决方案1】:

    继承可能会很棘手,并且并不总是很明显哪些属性是继承的,哪些不是。在这种情况下,RouteAttributeHttpGetAttribute 是继承的,但 ApiVersionAttribute 不是。

    以下配置将为您提供所需的内容:

    using static System.Environment;
    
    [ApiVersion( "1.0" )]
    [Route( "api/v{api-version:apiVersion}/[controller]" )]
    public class HeartbeatController : Controller
    {
        [HttpGet]
        public virtual IActionResult Get() => Ok( MachineName );
    }
    
    [ApiVersion( "2.0" )]
    public class HeartbeatController : V1.HeartbeatController
    {
        public override IActionResult Get() => Ok( "this is version 2 " + MachineName );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-02
      • 2018-12-13
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 2019-04-28
      相关资源
      最近更新 更多