.NET Core Web API部署至IIS后DELETE请求返回404错误求助
问题分析
你遇到的情况很典型:本地运行一切正常,但部署到IIS 10后唯独DELETE请求返回404,GET请求却能正常工作。这通常和IIS的配置限制、路由匹配逻辑或者跨域预检请求的处理有关。下面分两部分解决你的问题:
一、获取详细错误信息
要精准定位问题根源,先拿到更全面的日志和请求细节:
增强Web API日志输出
在Web API项目的appsettings.json里调整日志级别,让stdout日志捕获路由匹配的完整过程:{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Debug", "Microsoft.AspNetCore.Routing": "Trace" } } }部署后重启IIS站点,再触发DELETE请求,查看
stdout日志,里面会清晰显示请求是否到达了控制器的Action,以及路由匹配时的具体判断逻辑。抓包查看完整请求/响应
用浏览器开发者工具(F12)或者Fiddler捕获DELETE请求的完整信息:- 确认请求的HTTP方法确实是DELETE(偶尔会被重写规则或代理篡改)
- 检查是否有OPTIONS预检请求,以及它的响应状态码(如果OPTIONS返回404,浏览器会直接阻止后续的DELETE请求)
- 核对请求头里的
Content-Type、Origin等参数是否符合预期
查看IIS站点日志
在IIS管理器中找到你的站点,开启日志记录(默认通常已开启),日志文件一般存放在C:\inetpub\logs\LogFiles目录下。找到对应DELETE请求的条目,查看sc-status(主状态码)和sc-substatus(子状态码)——子状态码能给出更具体的失败原因,比如404.0是资源不存在,404.3是MIME类型限制。
二、修复DELETE请求404问题
根据常见的部署坑点,按以下步骤逐一排查:
确保IIS允许DELETE方法
IIS默认的请求筛选规则可能会拦截DELETE方法,需要手动开启:- 打开IIS管理器,找到目标站点 → 点击请求筛选
- 切换到HTTP方法标签 → 点击右侧的允许按钮
- 在弹出的对话框中输入
DELETE,点击确定
重启站点后再测试DELETE请求。
验证路由匹配是否正确
你的BaseApiController上标注了[Route("api/[controller]")],AdditiveController的Delete Action用了[HttpDelete("{id}")],理论上完整路由是api/additive/{id},和前端请求的URL一致,但要注意:- .NET Core路由默认不区分大小写,但IIS的URL重写可能存在大小写敏感问题,确保前端请求的URL和路由完全匹配(比如不要写成
api/Additive/3) - 检查是否有其他控制器或Action使用了相同的路由模板,导致请求被错误路由
- .NET Core路由默认不区分大小写,但IIS的URL重写可能存在大小写敏感问题,确保前端请求的URL和路由完全匹配(比如不要写成
确认AspNetCoreModule正确处理所有请求
虽然你的web.config里配置了verb="*",但要确保:- IIS已正确安装对应版本的.NET Core托管捆绑包(如果是.NET Core 3.1+,必须安装匹配的托管包才能让AspNetCoreModule正常工作)
- web.config里的
aspNetCore节点配置正确,示例如下:<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" /> - 没有其他IIS模块(比如静态文件模块)先拦截了请求,导致请求没到达AspNetCoreModule
处理跨域OPTIONS预检请求
如果Angular应用和Web API不在同一个域名下,浏览器会发送OPTIONS预检请求。如果Web API没有正确响应OPTIONS,会导致DELETE请求失败:- 在Web API的Startup.cs/Program.cs里配置CORS,允许DELETE方法和对应的Origin:
// .NET 6+ Program.cs示例 builder.Services.AddCors(options => { options.AddPolicy("AllowAngular", policy => policy.WithOrigins("http://your-angular-domain") .AllowAnyHeader() .AllowAnyMethod()); }); // 确保CORS中间件在UseRouting和UseAuthorization之前添加 app.UseCors("AllowAngular");
- 在Web API的Startup.cs/Program.cs里配置CORS,允许DELETE方法和对应的Origin:
检查URL重写规则是否干扰
如果你的站点配置了URL重写规则,可能会修改DELETE请求的路径,导致404。检查web.config里的<rewrite>节点,确保没有规则影响DELETE请求的路径匹配。
按照上面的步骤排查,基本能定位并解决问题。如果还是不行,把捕获到的日志和请求信息贴出来,能更精准地帮你分析。
内容的提问来源于stack exchange,提问作者BattlFrog




