You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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请求中携带防伪令牌(推荐,安全)

这是符合安全规范的做法,步骤如下:

  1. 在页面中添加防伪令牌元素
    在你的视图页面里添加防伪令牌的隐藏输入框:

    @Html.AntiForgeryToken()
    

    这会自动生成一个名为__RequestVerificationToken的隐藏输入框。

  2. 修改AJAX请求,在请求头中携带令牌
    调整你的JQuery代码,把防伪令牌放到请求头里:

    $.ajax({
        url: "@Url.Action(\"DeleteSite\",\"Company\")?id=" + currentSiteIdToDelete,
        type: "DELETE",
        headers: {
            "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val()
        },
        success: function (e) { console.log("yay") }
    })
    
  3. 确保控制器方法启用防伪验证(可选)
    如果你的项目没有全局启用防伪验证,可以在控制器方法上显式添加验证特性:

    [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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:22:54