gpt4 book ai didi

c# - 如何正确处理 ASP.Net Core 3 Web API 中的多个端点

转载 作者:行者123 更新时间:2023-12-01 16:35:54 25 4
gpt4 key购买 nike

我有两种方法来处理 HTTP GET 请求,第一个用于 int 类型输入,另一个用于 string 类型输入。

//GET : api/Fighters/5
[HttpGet("{id}")]
public async Task<ActionResult<Fighter>> GetFighter(int id)
{
var fighter = await _context.Fighters.FindAsync(id);

if (fighter == null)
{
return NotFound();
}
return fighter;
}

// GET: api/Fighters/Alex
[Route("api/Fighters/{name}")]
[HttpGet("{name}")]
public async Task<ActionResult<IEnumerable<Fighter>>> GetFighter (string name)
{
return await _context.Fighters.Where(f => f.Name == name).ToListAsync();
}

当我发送 HTTP GET 时出现此异常(在 Postman 中):

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

FighterGameService.Controllers.FightersController.GetFighter (FighterGameService)
FighterGameService.Controllers.FightersController.GetFighter (FighterGameService)
FighterGameService.Controllers.FightersController.GetFighter (FighterGameService)
FighterGameService.Controllers.FightersController.GetFighter (FighterGameService)
at Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.ReportAmbiguity(CandidateState[] candidateState)
at Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.ProcessFinalCandidates(HttpContext httpContext, CandidateState[] candidateState)
at Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.Select(HttpContext httpContext, CandidateState[] candidateState)
at Microsoft.AspNetCore.Routing.Matching.DfaMatcher.MatchAsync(HttpContext httpContext)
at Microsoft.AspNetCore.Routing.Matching.DataSourceDependentMatcher.MatchAsync(HttpContext httpContext)
at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

GET api/fighters/1 显然会导致错误,因为“1”可能是 intstring > 所以我通过结合两种方法解决了我的问题:

// GET: api/Fighters/5
// GET: api/Fighters/Alex
[HttpGet("{idOrName}")]
public async Task<ActionResult<IEnumerable<Fighter>>> GetFighter(string idOrName)
{
if (Int32.TryParse(idOrName, out int id))
{
return await _context.Fighters.Where(f => f.Id == id).ToListAsync();
}
else
{
return await _context.Fighters.Where(f => f.Name == idOrName).ToListAsync();
}

}

这可行,但是感觉一点也不正确。处理这个问题的正确方法是什么?

最佳答案

您可以使用route constraint

[HttpGet("{id:int}")]
public async Task<ActionResult<Fighter>> GetFighter(int id)

[HttpGet("{name}")]
public async Task<ActionResult<IEnumerable<Fighter>>> GetFighter (string name)

关于c# - 如何正确处理 ASP.Net Core 3 Web API 中的多个端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58157040/

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