请求匹配 .NET Core 上的多个端点

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()吗?

Яро*_*вич 5

您有两个具有 equals 路由的端点:get/{id} 和 get/{query}。

如果你在浏览器中输入:get/123,系统无法理解要使用什么路由,因为它们具有相同的模式。

你需要区分它们,我建议你使用restful风格的路由,例如:item/{id}、items?{your query}


Jon*_*lis 5

[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 应该为你构建你的对象。