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

ASP.NET+AngularJS项目调用文件保存方法后服务异常问题求助

问题根因

核心是ASP.NET的应用域(App Domain)自动回收机制被触发,和文件写入的操作本身无关。
ASP.NET默认会对站点根目录、bin、App_Code、App_Data、Web.config等路径做文件变动监控,只要这些路径下发生文件新增、修改、删除操作,就会主动触发应用域回收:

  • 回收时会释放当前应用域的所有内存资源,你代码中创建的System.Timers.Timer实例、内存缓存都会被直接销毁,所以会出现定时器停止的现象。
  • 回收过程中旧的请求处理管道已销毁,新应用域还在初始化(路由注册、服务加载等),这段时间内的接口请求会返回404,等新应用域初始化完成后刷新页面即可恢复,属于正常机制,所以不会在事件日志中记录错误。

解决方案

1. 优先调整文件存储路径

将动态写入的文件放到站点物理根目录之外的独立文件夹(例如D:\app_cache\这类和站点目录无关的路径),写入该路径下的文件不会触发ASP.NET的文件监控,自然不会触发应用域回收。

2. 如必须存储在站点目录下,修改监控配置

如果业务要求文件必须存在站点路径内,可以在Web.config中关闭文件变化监控:

<configuration>
  <system.web>
    <!-- 关闭全站文件变化监控,修改后站点文件变更不会自动触发重载,需手动重启站点生效 -->
    <httpRuntime fcnMode="Disabled" />
  </system.web>
</configuration>

如果只需要排除单个子目录,也可以将该目录配置为IIS虚拟目录,脱离站点物理路径的监控范围即可。

3. 优化定时任务实现

System.Timers.Timer是内存级实例,只要应用域回收就会停止,本身不适合在ASP.NET应用中做持久化定时任务。如果需要定时逻辑稳定运行,建议改用独立Windows服务运行定时任务,或是使用Hangfire等专门的ASP.NET后台任务框架,自带应用重启恢复能力。

验证方法

你可以先临时将文件写入路径改为站点目录外的任意位置测试,如果写入后不再出现404和定时器停止问题,即可100%确认是应用域回收导致的故障。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:36:06