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

ASP.NET Core Web API写入文件后返回500内部服务器错误排查

问题描述

我们有一个使用Visual Studio 2022开发的ASP.NET Core Web API应用,部署于IIS 10的.NET Core生产服务器上,正常运行一年多。核心功能是接收设备发送的JSON数据并写入独立数据文件,核心代码如下:

public IActionResult UpdateTestData([FromBody] InfoNegozio value)
{
    string str_rec = value.p1 + ";;'" + value.p2 + "';" + value.p3 + ";" + value.p4 + ";" + value.p5 + ";" + value.p6 + "\n";

    string webRootPath = _webHostEnvironment.WebRootPath;
    string contentRootPath = _webHostEnvironment.ContentRootPath;
    string data_file = "";
    string tmp1 = value.p2.Replace(" ", "_");
    string tmp2 = tmp1.Replace("-", "");
    string f_timestamp = tmp2.Replace(":", "");
    string fname = value.p1 + "_" + f_timestamp + ".txt";

    data_file = Path.Combine("D:\\test1\\test_data", "t1", fname);

    System.IO.File.WriteAllText(data_file, str_rec);

    return Content("{\"status\":\"success\",\"Message\":\"Successfully stored\"}", "application/json");
}

public class InfoNegozio
{
    public string p1 { get; set; }
    public string p2 { get; set; }
    public float p3 { get; set; }
    public float p4 { get; set; }
    public float p5 { get; set; }
    public float p6 { get; set; }
}

近期突然出现HTTP 500内部服务器错误:IIS日志显示所有请求均返回500状态码,但JSON数据已成功写入服务器指定目录,仅客户端无法收到成功响应。使用Postman发送application/json格式请求时,接口可正常工作(写入文件+返回成功响应)。

web.config配置如下(已开启stdoutLogEnabled):

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\TestAPI.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
    </system.webServer>
  </location>
</configuration>
<!--ProjectGuid: 250D451C-2WEC4-45E5-8DC6-6F342D456749BB2-->

已完成的排查动作:

  • 添加try-catch块记录异常,生产环境未捕获到异常,无日志写入,仍返回500错误
  • 在web.config中启用详细日志配置,仍无相关错误日志
  • IIS日志条目显示状态码500,子状态码0
  • 已获取正常工作的Postman请求头信息
  • 仅重启本站点而非整个IIS,不确定配置是否生效
  • Windows事件日志无相关500错误条目

可能原因及排查方向

1. 请求头差异引发的响应异常

Postman请求正常但设备请求失败,重点对比设备与Postman的请求头差异:

  • 检查设备发送的Content-Type是否严格为application/json,部分设备可能发送text/json或带额外后缀的类型,导致ASP.NET Core管道后续处理出错
  • 核对Accept头,若设备指定了特定响应格式(如text/plain),而接口返回的application/json不匹配,可能触发IIS或中间件的拦截
  • 检查自定义请求头(如User-Agent、Authorization),某些特殊头可能被IIS安全模块或防火墙拦截处理

2. 响应阶段的未捕获异常

Action内的业务逻辑已执行完成,但响应写入客户端时可能出错,这类异常发生在ASP.NET Core管道的后续阶段,无法被Action内的try-catch捕获:

  • 替换手动拼接JSON的Content返回方式,改用强类型对象返回,避免格式或编码错误:
    return Ok(new { status = "success", Message = "Successfully stored" });
    
  • 检查响应编码,确保返回的JSON编码与客户端预期一致(如UTF-8)

3. IIS托管模型与资源问题

应用使用inprocess托管模型,可能存在进程内资源冲突或回收问题:

  • 尝试将hostingModel改为outofprocess,修改web.config后重启整个IIS(部分配置更改需要全局重启生效),测试是否恢复正常
  • 检查应用池的回收设置,确认是否存在定时回收或内存/CPU阈值触发的回收,导致响应阶段被中断
  • 查看服务器的系统资源(CPU、内存、磁盘IO),确认是否存在资源耗尽导致的响应失败

4. 文件写入后的资源锁定或权限延迟

虽然文件已成功写入,但可能存在文件系统权限的延迟校验,触发后续错误:

  • 确认D:\test1\test_data\t1目录的权限,确保IIS应用池身份对该目录拥有完全控制权限(包括写入后的读取、修改权限)
  • 替换File.WriteAllText为显式释放资源的写法,避免隐式资源锁定:
    using (var stream = new FileStream(data_file, FileMode.Create, FileAccess.Write, FileShare.None))
    using (var writer = new StreamWriter(stream))
    {
        writer.Write(str_rec);
    }
    

5. IIS模块或ASP.NET Core中间件干扰

检查近期是否新增了IIS模块或ASP.NET Core中间件:

  • 临时禁用IIS中的非必要模块(如动态压缩、URL重写),测试是否恢复正常
  • 核对应用的Program.cs/Startup.cs,确认近期是否新增了响应处理相关的中间件,尝试临时移除后测试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:10:59