gpt4 book ai didi

asp.net-core - ASP.Net Web Api Core - 基于查询字符串参数的操作路由

转载 作者:行者123 更新时间:2023-12-04 13:15:13 25 4
gpt4 key购买 nike

我有一个有两个 Action 的 Controller 。每个操作都需要一个 GUID 参数。我的请求 URL 如下所示:
http://baseURL/api/v1.0/loadfactors/search?cedentId=5FF7165C-7575-EA11-AA4D-949554C02DE1

这是我的 Action 的样子:

    [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);
}

现在,当我提出请求时,这是我得到的错误:

处理请求时发生未处理的异常。
AmbiguousMatchException:请求匹配多个端点。火柴:

LoadFactorsController.GetByLobSettingsId (Api)
LoadFactorsController.GetByAccountId (Api)

似乎正在查找多个操作,而不是根据查询参数识别操作。如何根据参数进行匹配?

谢谢。

最佳答案

An unhandled exception occurred while processing the request. AmbiguousMatchException: The request matched multiple endpoints.



由于错误表明请求匹配多个导致歧义的操作。

要修复它并实现您的要求,您可以尝试以下方法:

方法一:将这两个 Action 合并为一个 Action 并动态检查客户端传递的查询字符串值。
[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);
}

方法二:实现自定义 ActionMethodSelectorAttribute根据传递的查询字符串启用或禁用给定请求的操作,如下所示。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class CheckQueryStingAttribute : ActionMethodSelectorAttribute
{
public string QueryStingName { get; set; }
public bool CanPass { get; set; }
public CheckQueryStingAttribute(string qname, bool canpass)
{
QueryStingName = qname;
CanPass = canpass;
}

public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
{
StringValues value;

routeContext.HttpContext.Request.Query.TryGetValue(QueryStingName, out value);

if (CanPass)
{
return !StringValues.IsNullOrEmpty(value);
}

return StringValues.IsNullOrEmpty(value);
}
}

将其应用于操作
[HttpGet("search")]
[CheckQueryStingAttribute("lobSettingsId",true)]
[CheckQueryStingAttribute("cedentId", false)]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<List<LoadFactorResource>> GetByLobSettingsId([FromQuery]Guid lobSettingsId)
{
return await _service.GetByCedentId(cedentId);
}

[HttpGet, Route("search")]
[CheckQueryStingAttribute("lobSettingsId", false)]
[CheckQueryStingAttribute("cedentId", true)]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<List<LoadFactorResource>> GetByAccountId([FromQuery]Guid cedentId)
{
return await _service.GetByCedentId(cedentId);
}

关于asp.net-core - ASP.Net Web Api Core - 基于查询字符串参数的操作路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61123591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com