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

ASP.NET MVC应用无法接收DELETE请求,报404错误求解决

为什么ASP.NET中DELETE请求返回404,改用GET就正常?

先还原下你的场景:

在HomeController里写了一个带[HttpDelete]特性的方法:

[HttpDelete]
public void DeleteEmployee() { ... }

然后用Ajax发送DELETE请求:

$.ajax({
    url: '/Home/DeleteEmployee',
    type: 'DELETE',
    contentType: "application/json;charset=utf-8",
    success: function () { alert('Successfully deleted'); },
    error: function () { alert('Failed to delete'); }
});

结果执行时返回404错误,但把请求类型改成GET,控制器方法换成[HttpGet]就正常运行,这到底是为啥?


这种情况在ASP.NET(尤其是传统MVC框架)里非常常见,主要有这几个核心原因:

1. WebDAV模块拦截了DELETE请求

这是最普遍的原因!默认情况下,IIS里的WebDAV模块会优先处理DELETE请求,导致你的控制器方法根本接收不到这个请求,直接返回404。WebDAV本来是用于文件管理的协议,但它会抢占HTTP DELETE动词的处理权。

2. ASP.NET请求验证的安全限制

ASP.NET有默认的请求验证机制,会阻止一些“非标准”的HTTP动词(比如DELETE、PUT),目的是防范CSRF攻击或者恶意请求,尤其是在WebForms遗留的配置中,这种限制会更严格。

3. 路由配置未正确映射DELETE动词

虽然你给方法加了[HttpDelete]特性,但如果路由模板没有明确允许DELETE请求,或者路由约束里没包含DELETE,也可能导致请求无法匹配到对应的控制器方法。


对应的解决方案,按优先级推荐:

方案1:移除WebDAV模块(最推荐)

在项目的Web.config文件中,找到<system.webServer>节点,添加以下配置,移除WebDAV的处理模块和处理器:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>

这个操作不会影响你的业务逻辑,只是让IIS不再用WebDAV处理DELETE请求,把请求交还给ASP.NET MVC框架。

方案2:明确配置路由支持DELETE动词

如果路由没有正确识别DELETE请求,可以在路由配置中添加针对该方法的路由约束:

routes.MapRoute(
    name: "DeleteEmployeeRoute",
    url: "Home/DeleteEmployee",
    defaults: new { controller = "Home", action = "DeleteEmployee" },
    constraints: new { httpMethod = new HttpMethodConstraint("DELETE") }
);

不过如果你的控制器方法已经加了[HttpDelete],这个步骤可能不是必须,但可以作为补充排查手段。

方案3:调整请求验证设置(不推荐,谨慎使用)

如果是请求验证导致的,可以在控制器或者方法上添加[ValidateInput(false)]特性,但这会关闭请求验证,降低应用的安全性,只建议在测试环境临时验证原因,不要在生产环境使用。


内容的提问来源于stack exchange,提问作者Arkadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:20:50