Jac*_*ack 0 c# api rest .net-core webapi
我在 .NET Core 项目中使用 OpenAPI (Swagger),当使用多个具有类似获取请求的方法时,我遇到“Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException:请求匹配多个端点”。运行时出错。我查看了 web 和 SO 上的几个页面,并尝试应用诸如请求匹配多个端点之类的解决方法,但为什么呢?,但这并不能解决问题。以下是我使用的 API 方法和路由定义。
[Route("get", Name="get")]
public IEnumerable<DemoDto> Get()
{
//
}
[Route("get/{id}", Name="getById")]
public DemoDto GetById(int id)
{
//
}
[Route("get/{query}", Name="getWithPagination")]
public IEnumerable<DemoDto> GetWithPagination(DemoQuery query)
{
//
}
Run Code Online (Sandbox Code Playgroud)
我使用Name财产来解决问题但没有解决。有什么想法可以改变路线以区分Get()和GetWithPagination()吗?
您有两个具有 equals 路由的端点:get/{id} 和 get/{query}。
如果你在浏览器中输入:get/123,系统无法理解要使用什么路由,因为它们具有相同的模式。
你需要区分它们,我建议你使用restful风格的路由,例如:item/{id}、items?{your query}
[Route("get/{query}", Name="getWithPagination")]
这没有意义。 DemoQuery是一个对象,它不能由 url 的单个部分表示。不过,您可以告诉 ModelBinder 从多个查询参数构建您的对象。
路由引擎将此路由与路由混淆[Route("get/{id}", Name="getById")]。他们似乎都匹配get/blah。
除了修复您的DemoQuery路线,请尝试在路线上添加路线约束id-
[Route("get/{id:int}", Name="getById")]
Run Code Online (Sandbox Code Playgroud)
更好地帮助发动机。
为了开始DemoQuery工作,假设它看起来像:
public class DemoQuery
{
public string Name { get; set; }
public int Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后将您的操作更改为
[Route("getPaged/{query}", Name="getWithPagination")]
public IEnumerable<DemoDto> GetWithPagination([FromQuery] DemoQuery query)
Run Code Online (Sandbox Code Playgroud)
然后调用端点像/getPaged?name=test&value=123. ModelBinder 应该为你构建你的对象。
| 归档时间: |
|
| 查看次数: |
2851 次 |
| 最近记录: |