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
相关产品推荐
相关产品推荐

