ASP.NET Core中HttpDelete请求返回400错误,HttpGet正常如何解决?
解决ASP.NET Core中DELETE请求返回400 Bad Request的问题
你遇到的这个400错误,核心原因是ASP.NET Core默认会对非GET类型的请求(包括DELETE)验证防伪令牌(Anti-Forgery Token),而你的AJAX DELETE请求里没有携带这个令牌,导致验证失败返回400。GET请求因为语义是只读获取资源,默认不要求防伪验证,所以之前可以正常工作。
下面给你两种可行的解决方案:
方案一:在AJAX请求中携带防伪令牌(推荐,安全)
这是符合安全规范的做法,步骤如下:
在页面中添加防伪令牌元素
在你的视图页面里添加防伪令牌的隐藏输入框:@Html.AntiForgeryToken()这会自动生成一个名为
__RequestVerificationToken的隐藏输入框。修改AJAX请求,在请求头中携带令牌
调整你的JQuery代码,把防伪令牌放到请求头里:$.ajax({ url: "@Url.Action(\"DeleteSite\",\"Company\")?id=" + currentSiteIdToDelete, type: "DELETE", headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val() }, success: function (e) { console.log("yay") } })确保控制器方法启用防伪验证(可选)
如果你的项目没有全局启用防伪验证,可以在控制器方法上显式添加验证特性:[HttpDelete] [Route(nameof(DeleteSite))] [ValidateAntiForgeryToken] public ActionResult DeleteSite(int id) { return Json("ok"); }
方案二:禁用该方法的防伪验证(不推荐,仅用于特殊场景)
如果你是开发公开API或者确定不需要CSRF防护(比如无用户登录的封闭场景),可以临时关闭该方法的防伪验证:
[HttpDelete] [Route(nameof(DeleteSite))] [IgnoreAntiforgeryToken] public ActionResult DeleteSite(int id) { return Json("ok"); }
⚠️ 注意:这种方式会关闭CSRF防护,可能带来安全风险,仅建议在非用户交互的特定场景下使用。
另外补充一点:如果你的项目使用ASP.NET Core 3.0及以上版本,全局默认已经启用了防伪验证中间件,所有非GET请求都必须携带令牌才能通过验证。
内容的提问来源于stack exchange,提问作者Mateus Wolkmer
相关产品推荐
相关产品推荐

