ASP.NET Core Web API中MasterController多端点匹配异常如何解决
问题原因
你的控制器中定义了3个未配置专属路由的[HttpGet]接口,控制器全局路由规则为[Route("[controller]")],所有接口都匹配/Master路径,ASP.NET Core路由系统无法区分请求要调用哪个接口,因此抛出AmbiguousMatchException异常。
解决方案
有两种常用的修复方案,按需选择即可:
方案1:为每个接口单独配置子路由
直接在HttpGet特性中指定当前接口的子路由标识,自定义程度高:
using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using VENUS.HRMS.API.Filters; using VENUS.HRMS.DATA.Data; using VENUS.HRMS.DATA.Models; namespace VENUS.HRMS.API.Controllers { [ApiController] [Route("[controller]")] // 纯API控制器建议继承ControllerBase,移除无关的View返回逻辑 public class MasterController : ControllerBase { [HttpGet("EmpRole")] [AuthorizationFilter] public IEnumerable<TblMstEmpRole> Get() { var emprole = new EmpRoleData().GetMstEmpRole(); return emprole; } [HttpGet("State")] [AuthorizationFilter] public IEnumerable<TblMstState> GetState() { var state = new StateData().GetMstState(); return state; } [HttpGet("City")] [AuthorizationFilter] public IEnumerable<TblMstCity> GetCity() { var city = new CityData().GetMstCity(); return city; } } }
修改后三个接口的访问路径分别为:
/Master/EmpRole/Master/State/Master/City
方案2:全局配置路由携带Action名称
修改控制器级别的路由规则,自动将Action名称拼接为路由的一部分,不需要单独给每个接口配路由:
[ApiController] // 新增[action]占位符,路由规则变为 控制器名/方法名 [Route("[controller]/[action]")] public class MasterController : ControllerBase { [HttpGet] [AuthorizationFilter] public IEnumerable<TblMstEmpRole> Get() { var emprole = new EmpRoleData().GetMstEmpRole(); return emprole; } [HttpGet] [AuthorizationFilter] public IEnumerable<TblMstState> GetState() { var state = new StateData().GetMstState(); return state; } [HttpGet] [AuthorizationFilter] public IEnumerable<TblMstCity> GetCity() { var city = new CityData().GetMstCity(); return city; } }
修改后三个接口的访问路径分别为:
/Master/Get/Master/GetState/Master/GetCity
内容的提问来源于stack exchange,提问作者Saurabh sharma
相关产品推荐
相关产品推荐

