簡體   English   中英

請求匹配 .NET Core 上的多個端點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM