首页 > 解决方案 > dot Net Core MVC 中 HttpMethodAttribute 的奇怪歧义

问题描述

我注意到 .Net Core 中 MVC 路由的意外行为。由于我没有预料到这种行为并且我不知道解决它的简单方法,所以我请求您的帮助。:)

[HttpPut("obj/{pk?}")]
public IActionResult SaveObj(decimal? pk, [FromBody] ObjDef obj)
{
[..]
}

一切正常。我可以通过请求 Put on 添加新对象/obj并通过请求更新它/obj/1

我的惊喜是,当我请求像/obj/AStringValueSaveObj 方法一样放入 uri 时,仍然会调用空 PK 值,因此如果请求具有正确的有效负载,则会创建新的 obj。

我的期望是获得 404 标头,因为显然在我的任何控制器中都没有声明这样的路径。

作为一种解决方法,我提出了两种方法——一种具有强制十进制参数 PK,另一种根本没有参数,但是具有十进制 PK 的方法仍然被触发,pk 等于 0!这在我看来是完全不正确的。

我应该如何处理这种行为?或者我在这里做错了什么......

我的 AspNetCore MVC 版本是 2.2.0

标签: c#restapiasp.net-core

解决方案


您可以使用路由约束来验证路由参数的类型。如果约束失败,则返回 404,就好像该路由根本不存在一样。在您的情况下,您可以使用decimal约束,如下所示:

[HttpPut("obj/{pk:decimal?}")]

这表明这pk是可选的,但是当它被提供时,它必须是一个有效的十进制值。


推荐阅读