ASP.NET MVC应用无法接收DELETE请求,报404错误求解决
先还原下你的场景:
在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

