[英]The request matched multiple endpoints on .NET Core
我在 .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)
{
//
}
我使用Name
屬性來解決問題但沒有解決。 任何想法改變路線以區分Get()
和GetWithPagination()
?
[Route("get/{query}", Name="getWithPagination")]
這沒有意義。 DemoQuery
是一個對象,它不能由 url 的單個部分表示。 不過,您可以告訴 ModelBinder 從多個查詢參數構建您的對象。
路由引擎將此路由與[Route("get/{id}", Name="getById")]
路由混淆。 它們似乎都匹配get/blah
。
除了修復您的DemoQuery
路由,嘗試在id
路由上添加路由約束 -
[Route("get/{id:int}", Name="getById")]
更好地幫助發動機。
為了讓DemoQuery
工作,假設它看起來像:
public class DemoQuery
{
public string Name { get; set; }
public int Value { get; set; }
}
然后將您的操作更改為
[Route("getPaged/{query}", Name="getWithPagination")]
public IEnumerable<DemoDto> GetWithPagination([FromQuery] DemoQuery query)
然后調用端點,如/getPaged?name=test&value=123
。 ModelBinder 應該為您構建對象。
您有兩個具有 equals 路由的端點:get/{id} 和 get/{query}。
如果你在瀏覽器中寫一行:get/123,系統無法理解使用什么路由,因為它們具有相同的模式。
你需要區分它們,我建議你對路由使用寧靜的風格,比如:item/{id}, items?{your query}
ASP.NET Web API 2 支持一種新型路由。 官方文件
路由約束允許您限制參數類型並與這些類型(整數、字符串、甚至日期等)匹配。 一般語法是“{parameter:constraint}”
[Route("users/{id:int}")]
public User GetUserById(int id) { ... }
[Route("users/{name}")]
public User GetUserByName(string name) { ... }
我在 API 上測試過;
//match : api/users/1
[HttpGet("{id:int}")]
public IActionResult GetUserById(int id){ ... }
//match : api/users/gokhan
[HttpGet("{name}")]
public IActionResult GetUserByName(string name){ ... }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.