You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.NET Core Web API部署至IIS后DELETE请求返回404错误求助

问题分析

你遇到的情况很典型:本地运行一切正常,但部署到IIS 10后唯独DELETE请求返回404,GET请求却能正常工作。这通常和IIS的配置限制、路由匹配逻辑或者跨域预检请求的处理有关。下面分两部分解决你的问题:


一、获取详细错误信息

要精准定位问题根源,先拿到更全面的日志和请求细节:

  1. 增强Web API日志输出
    在Web API项目的appsettings.json里调整日志级别,让stdout日志捕获路由匹配的完整过程:

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Debug",
          "Microsoft.AspNetCore.Routing": "Trace"
        }
      }
    }
    

    部署后重启IIS站点,再触发DELETE请求,查看stdout日志,里面会清晰显示请求是否到达了控制器的Action,以及路由匹配时的具体判断逻辑。

  2. 抓包查看完整请求/响应
    用浏览器开发者工具(F12)或者Fiddler捕获DELETE请求的完整信息:

    • 确认请求的HTTP方法确实是DELETE(偶尔会被重写规则或代理篡改)
    • 检查是否有OPTIONS预检请求,以及它的响应状态码(如果OPTIONS返回404,浏览器会直接阻止后续的DELETE请求)
    • 核对请求头里的Content-TypeOrigin等参数是否符合预期
  3. 查看IIS站点日志
    在IIS管理器中找到你的站点,开启日志记录(默认通常已开启),日志文件一般存放在C:\inetpub\logs\LogFiles目录下。找到对应DELETE请求的条目,查看sc-status(主状态码)和sc-substatus(子状态码)——子状态码能给出更具体的失败原因,比如404.0是资源不存在,404.3是MIME类型限制。


二、修复DELETE请求404问题

根据常见的部署坑点,按以下步骤逐一排查:

  1. 确保IIS允许DELETE方法
    IIS默认的请求筛选规则可能会拦截DELETE方法,需要手动开启:

    • 打开IIS管理器,找到目标站点 → 点击请求筛选
    • 切换到HTTP方法标签 → 点击右侧的允许按钮
    • 在弹出的对话框中输入DELETE,点击确定
      重启站点后再测试DELETE请求。
  2. 验证路由匹配是否正确
    你的BaseApiController上标注了[Route("api/[controller]")],AdditiveController的Delete Action用了[HttpDelete("{id}")],理论上完整路由是api/additive/{id},和前端请求的URL一致,但要注意:

    • .NET Core路由默认不区分大小写,但IIS的URL重写可能存在大小写敏感问题,确保前端请求的URL和路由完全匹配(比如不要写成api/Additive/3
    • 检查是否有其他控制器或Action使用了相同的路由模板,导致请求被错误路由
  3. 确认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
  4. 处理跨域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");
      
  5. 检查URL重写规则是否干扰
    如果你的站点配置了URL重写规则,可能会修改DELETE请求的路径,导致404。检查web.config里的<rewrite>节点,确保没有规则影响DELETE请求的路径匹配。


按照上面的步骤排查,基本能定位并解决问题。如果还是不行,把捕获到的日志和请求信息贴出来,能更精准地帮你分析。

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

火山引擎 最新活动