防止ASP.NET MVC验证URL和JSON属性之间的id不匹配
如果URL参数值与同名的JSON属性值不匹配,ASP.NET MVC似乎会抛出一个参数异常。例如,使用默认路线:防止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
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
与URLfoo
中的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”