.net core中,webapi开发时,两个GET接口的URL一样,只是其中一个接口有"?key=XXX"的查询条件,这样的场景,应该如何编写代码才能避免“The request matched multiple endpoints”呢?

事先说明,这两个接口的规范是甲方制定的,我无权修改。。。。

两个接口的开头如下(方法内容已经省略):

[HttpGet("provMns/{apiVersion}/nssts", Name = "getNSST")]
public IActionResult DoGetNSST(string apiVersion, [FromQuery] string nsstids)
{.....}
[HttpGet("provMns/{apiVersion}/nssts", Name = "getAllNSSTs")]
public IActionResult DoGetAllNSSTs(string apiVersion)
{.....}

实际使用PostMan测试时,如果发送Get请求消息的URL如下:
https://localhost:44353/api/rest/provMns/v1/nssts?nsstids=NSST-C-001-HDBNJ-NSSMF-01-A-ZX

就会报错:


Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: The request matched multiple endpoints. Matches: 

MyRestfulApi.Controllers.MyRestfulApiController.DoGetAllNSSTs (MyRestfulApi)
MyRestfulApi.Controllers.MyRestfulApiController.DoGetNSST (MyRestfulApi)

明显是因为同时匹配到了两个不同的接口导致的,该如何在不改变接口规范的情况下修改代码呢?

在 Restful 的规则中同名方法重载时,请求类型不能一样。如果因为使用场景限制需要用到同名方法可以把代码改为下面这种:

        [HttpGet("provMns/{apiVersion}/nssts", Name = "getNSST")]
        public IActionResult DoGetNSST(string apiVersion, [FromQuery] string nsstids)
        {
            return Json(new { apiVersion , nsstids });
        }

        [HttpPost("provMns/{apiVersion}/nssts", Name = "getAllNSSTs")]
        public IActionResult DoGetAllNSSTs(string apiVersion)
        {
            return Json(new { apiVersion });
        }

这两个方法的区别是,前面是 HttpGet,后面是 HttpPost。这样就可以使用同名方法重载了。