C# 有没有一种方法可以使框架引用基于请求体的正确方法?(一项与多项)

C# 有没有一种方法可以使框架引用基于请求体的正确方法?(一项与多项),c#,rest,.net-core,C#,Rest,.net Core,我想允许客户端只发送一个项目和一个项目集合的POST请求,而不改变方法路由 例如: 发布此正文: { "foo": "some value" } [ { "foo": "some value" }, { "foo": "some value" } ] 应达到此方法: [HttpPost] public async Task<IActionResult> Post([From

我想允许客户端只发送一个项目和一个项目集合的POST请求,而不改变方法路由

例如:

发布此正文:

{
    "foo": "some value"
}       
[
    {
        "foo": "some value"
    },
    {
        "foo": "some value"
    }   
]
应达到此方法:

[HttpPost]        
public async Task<IActionResult> Post([FromBody] MyPostRequest request = null)
[HttpPost]
public async Task<IActionResult> Post([FromBody] IEnumerable<MyPostRequest> requests = null)
应达到此方法:

[HttpPost]        
public async Task<IActionResult> Post([FromBody] MyPostRequest request = null)
[HttpPost]
public async Task<IActionResult> Post([FromBody] IEnumerable<MyPostRequest> requests = null)
[HttpPost]
公共异步任务发布([FromBody]IEnumerable requests=null)
但请求失败,原因是:

Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException:异常 请求匹配多个端点

接下来,我可以看到这是最好的选择,但问题是基本类型作为参数,路由约束只支持基本类型


有没有一种方法可以让框架理解如何根据请求的主体引用正确的签名(一项对多项)?更改方法名称是最后的手段。

如果不进行一些严重的框架修改,将无法单独通过路由实现这一点;正如您所发现的,最近的内置功能“管线约束”仅适用于基本体。如果您确实需要此功能,我会同意Nkosi在注释中的建议:在到达控制器方法之前,以编程方式将单个项添加到
IEnumerable


为了避免对端点正在做什么的混淆,我将完全避免这种情况:要么需要一个数组,要么为该操作创建一个单独的端点。每个REST端点都应该引用一种类型的资源,即使端点引用单个模型,从技术上讲,您处理的是两种类型的资源:集合和对象

创建自定义模型绑定器以获取单个post项,并将其添加到集合中,然后将其传递给第二个操作。这样一个操作就可以同时处理单个项和集合似乎集合中的方法就足够了,一个项可能也在集合中,并且没有不明确的匹配。是否有充分的理由保留仅持有一个实体的第二种方法?