我想允许客户端发送仅一个项目和一个项目集合的帖子请求,而无需更改方法路由。
例如:
发布此正文:
{
"foo": "some value"
}
应达到此方法:
[HttpPost]
public async Task<IActionResult> Post([FromBody] MyPostRequest request = null)
发布此正文:
[
{
"foo": "some value"
},
{
"foo": "some value"
}
]
应达到此方法:
[HttpPost]
public async Task<IActionResult> Post([FromBody] IEnumerable<MyPostRequest> requests = null)
但请求失败,并显示:
Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: 请求匹配多个终结点。
在这个问题之后,我能够看到路由约束是最佳选择,但问题是关于基元类型作为参数,而路由约束仅支持基元类型。
有没有办法让框架理解根据请求的正文(一个项目与多个项目(引用正确的签名? 更改方法名称是最后的手段。
如果没有一些认真的框架修改,就没有办法仅靠路由来完成这一点;正如你所发现的,最接近的内置功能,路由约束,只适用于基元。如果您绝对需要此功能,我会在评论中使用 Nkosi 的建议:在单个项目到达控制器方法之前以编程方式将单个项目添加到IEnumerable
中。
为了避免混淆端点正在做什么,我将完全避免这种情况:要么需要一个数组,要么为该操作创建一个单独的端点。每个 REST 端点都应引用一种类型的资源,即使端点引用单个模型,从技术上讲,您正在处理两种类型的资源:集合和对象。