【发布时间】:2021-04-09 21:28:24
【问题描述】:
我完成了我的第一个 OData-Request 工作:
[HttpGet]
[EnableQuery]
public IQueryable<ApplicationUser> Get()
{
return _applicationUserRepository.GetAll();
}
现在我想为 Get(id) 添加第二个:
[HttpGet]
[EnableQuery]
public ApplicationUser Get([FromODataUri]long id)
{
return _applicationUserRepository.Get(id).Result;
}
现在的问题是,当我尝试使用邮递员执行第一次调用时,结果是:
GET http://localhost:5000/api/v1/applicationuser?$filter=startsWith(LastName,%20%27Test%27)
Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException:请求匹配多个端点。匹配:
- MyAssambly.Controllers.ApplicationUserController.Get (MyAssambly)
- MyAssambly.Controllers.ApplicationUserController.Get (MyAssambly)
在 Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.ReportAmbiguity(CandidateState[] CandidateState) 在 Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.ProcessFinalCandidates(HttpContext httpContext,CandidateState[] CandidateState) 在 Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.Select(HttpContext httpContext, CandidateState[] CandidateState) 在 Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.SelectAsync(HttpContext httpContext,CandidateSet 候选集) 在 Microsoft.AspNetCore.Routing.Matching.DfaMatcher.SelectEndpointWithPoliciesAsync(HttpContext httpContext,IEndpointSelectorPolicy[] 策略,CandidateSet 候选集) 在 Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.g__AwaitMatch|8_1(EndpointRoutingMiddleware 中间件,HttpContext httpContext,任务 matchTask) 在 Microsoft.AspNetCore.ResponseCompression.ResponseCompressionMiddleware.Invoke(HttpContext 上下文) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)
所以我不知道问题可能是什么。方法是不同的,第二个应该明确地用 ID 参数调用它。 我做错了什么?
【问题讨论】:
-
我之前没有使用过 OData,但我可以想象您需要将
{id}定义为路由的一部分,或者如果它具有路由属性,则使用 OData 属性。在互联网上,我发现[ODataRoute("({Id})")]有人使用他们的方法来区分 GET 和 GET 之间的路由(id)。而且,这就是它与 REST API 一起工作的方式,所以这很可能是你的问题。 -
@Dennis1679 正是我的想法,我也试过这个。但是在 v8.0.0-rc 中,当我尝试将符号
ODataRoute添加为我的操作的属性时,它无法解析它。也许它被替换或简单地删除了......
标签: c# asp.net-core odata .net-5