C# 点网络核心MVC中HttpMethodAttribute的奇怪歧义

C# 点网络核心MVC中HttpMethodAttribute的奇怪歧义,c#,rest,api,asp.net-core,C#,Rest,Api,Asp.net Core,我注意到.NETCore中的MVC路由异常。由于我没有预料到这种行为,而且我不知道简单的解决方法,我请求您的帮助 一切正常。我可以通过请求打开/obj来添加新对象,并通过请求/obj/1来更新它 我感到惊讶的是,当我请求放入uri(如/obj/AStringValue时,SaveObj方法仍然会被调用,PK值为空,因此如果请求有正确的负载,就会创建新的obj 我的期望是得到404头,因为很明显,在我的任何控制器中都没有声明这样的路径 作为一种解决方法,我创建了两种方法——一种是强制使用十进制参数

我注意到.NETCore中的MVC路由异常。由于我没有预料到这种行为,而且我不知道简单的解决方法,我请求您的帮助

一切正常。我可以通过请求打开
/obj
来添加新对象,并通过请求
/obj/1
来更新它

我感到惊讶的是,当我请求放入uri(如
/obj/AStringValue
时,SaveObj方法仍然会被调用,PK值为空,因此如果请求有正确的负载,就会创建新的obj

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

作为一种解决方法,我创建了两种方法——一种是强制使用十进制参数tr PK,另一种是完全不使用参数,但之后使用十进制PK的方法仍然被触发,PK等于0!我认为这是完全错误的

我应该如何处理这种行为?还是我做错了什么

我的AspNetCore MVC版本是2.2.0

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

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

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

为什么您的pk是可为空的十进制值?事实上,为什么它是十进制?我通常会使用整数或guid作为主键。我假设您正在尝试使用单一方法进行插入和更新。如果是这种情况,我建议不要通过pk,在决定是否插入或更新数据库之前,检查obj是否有id。好吧,这只是一个decentral-它与我的问题无关,因此我将不再进一步描述它。至于从对象读取pk,它可以作为一种解决方法,但这样的API并不符合我对适当REST的概念,每个对象都有自己的路径,并在该路径上请求GET、PUT和DELETE,您可以对其进行操作。
[HttpPut("obj/{pk:decimal?}")]