防止ASP.NET MVC验证URL和JSON属性之间的id不匹配

防止ASP.NET MVC验证URL和JSON属性之间的id不匹配,asp.net,json,asp.net-mvc,Asp.net,Json,Asp.net Mvc,如果URL参数值与同名的JSON属性值不匹配,ASP.NET MVC似乎会抛出一个参数异常。例如,使用默认路线: routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Opt

如果URL参数值与同名的JSON属性值不匹配,ASP.NET MVC似乎会抛出一个参数异常。例如,使用默认路线:

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
假设我创建了一个端点,如下所示:

public class TestController : Controller
{
        [HttpPost]
        public ActionResult Webhooks(string id)
        {
          // do something
        }
}
如果发送了以下请求:

POST http://something.com/test/webhooks/foo HTTP/1.1
Content-Type: application/json

{"id": "bar"}
…然后MVC将抛出ArgumentException,因为id值
bar
与URL
foo
中的id不匹配

如果我将内容类型更改为application/json以外的其他类型,则不会出现此问题(可能b/cmvc不会尝试读取有效负载)。这似乎也只发生在生产中


我们如何防止MVC执行此验证?

如果URL中不存在值,您是否需要从正文中获取该值?我最初的想法是通过实现
IValueProvider
使用自定义值提供程序。对不起,我不熟悉细节。我不明白你为什么要这样做。您要求它通过决定哪个值优先,来接受
id
参数的冲突值。虽然你可以让它这么做,但一开始不制造冲突不是更好吗?
id
foo
或者是
bar
。根本无法复制。
id
的值在POST方法中是“bar”(这是它应该是的-JsonValueProvider战胜了RouteValueProvider)。错误消息的具体细节是什么?(我能由此产生的唯一错误是,如果我没有对数据进行字符串化,但这是另一个错误),删除
contentType
选项只意味着它将使用默认值(
application/x-www-form-urlencoded;charset=UTF-8
)-它仍然在请求中发送,但将使用FormValueProvider(它也会赢)所以参数的值仍然是“bar”