Ash*_*yed 7 asp.net-web-api asp.net-core
我有一个具有两个操作的控制器。每个操作都采用一个 GUID 参数。我的请求网址如下所示: http://baseURL/api/v1.0/loadfactors/search?cedentId=5FF7165C-7575-EA11-AA4D-949554C02DE1
这就是我的行为:
[HttpGet("search")]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<List<LoadFactorResource>> GetByLobSettingsId([FromQuery]Guid lobSettingsId)
{
return await _service.GetByLobSettingsId(lobSettingsId);
}
[HttpGet,Route("search")]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<List<LoadFactorResource>> GetByAccountId([FromQuery]Guid cedentId)
{
return await _service.GetByCedentId(cedentId);
}
Run Code Online (Sandbox Code Playgroud)
现在,当我发出请求时,这是我收到的错误:
处理请求时发生未处理的异常。AmbigeousMatchException:请求匹配多个端点。火柴:
LoadFactorsController.GetByLobSettingsId (Api) LoadFactorsController.GetByAccountId (Api)
它似乎正在查找多个操作,而不是根据查询参数识别操作。如何使其根据参数匹配?
谢谢。
处理请求时发生未处理的异常。AmbigeousMatchException:请求匹配多个端点。
由于错误表明请求与多个操作匹配,从而导致歧义。
要修复它并达到您的要求,您可以尝试以下方法:
方法一: 将这两个动作合并为一个动作,并动态检查客户端传递的查询字符串值。
[HttpGet("search")]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<List<LoadFactorResource>> GetByLobSettingsId([FromQuery]Guid lobSettingsId, [FromQuery]Guid cedentId)
{
if (lobSettingsId != Guid.Empty)
{
return await _service.GetByLobSettingsId(lobSettingsId);
}
return await _service.GetByCedentId(cedentId);
}
Run Code Online (Sandbox Code Playgroud)
方法 2: 实现自定义ActionMethodSelectorAttribute以根据传递的查询字符串启用或禁用给定请求的操作,如下所示。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class CheckQueryStringAttribute : ActionMethodSelectorAttribute
{
public string QueryStringName { get; set; }
public bool CanPass { get; set; }
public CheckQueryStringAttribute(string qname, bool canpass)
{
QueryStringName = qname;
CanPass = canpass;
}
public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
{
StringValues value;
routeContext.HttpContext.Request.Query.TryGetValue(QueryStringName, out value);
if (CanPass)
{
return !StringValues.IsNullOrEmpty(value);
}
return StringValues.IsNullOrEmpty(value);
}
}
Run Code Online (Sandbox Code Playgroud)
将其应用到行动中
[HttpGet("search")]
[CheckQueryStringAttribute("lobSettingsId",true)]
[CheckQueryStringAttribute("cedentId", false)]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<List<LoadFactorResource>> GetByLobSettingsId([FromQuery]Guid lobSettingsId)
{
return await _service.GetByCedentId(cedentId);
}
[HttpGet, Route("search")]
[CheckQueryStringAttribute("lobSettingsId", false)]
[CheckQueryStringAttribute("cedentId", true)]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<List<LoadFactorResource>> GetByAccountId([FromQuery]Guid cedentId)
{
return await _service.GetByCedentId(cedentId);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1511 次 |
| 最近记录: |