多用户同时读取配置key时出现web.config文件被占用报错问题
问题排查与解决方案
根因定位
ConfigurationManager.GetSection 本身是只读API,默认不会对web.config文件加独占写锁,出现文件占用报错核心原因只有两类:存在并发写web.config的逻辑,或第三方进程持有了web.config的文件锁。
排查步骤
- 首先排查全局代码中是否存在调用
Configuration.Save()这类写入web.config的逻辑:高并发场景下未加锁的写操作是最常见的诱因,读写操作同时触发时就会出现占用报错 - 排查服务器上是否存在第三方工具(杀毒软件、备份工具、部署代理等)会定时扫描、读取/修改web.config文件,这类工具的操作也会和应用的读请求冲突
解决方法
方案1:优化配置读取逻辑
ConfigurationManager 默认自带系统级缓存,无需每次请求都实时读磁盘,建议将配置做进程内单例缓存,大幅降低IO冲突概率:
private static volatile NameValueCollection _customConfig; private static readonly object _lockObj = new(); public static NameValueCollection CustomConfig { get { if (_customConfig == null) { lock (_lockObj) { _customConfig ??= ConfigurationManager.GetSection("keyname") as NameValueCollection; } } return _customConfig; } }
如果需要支持热更新,可监听配置文件变更事件,仅在文件修改后刷新缓存即可。
方案2:优化写配置逻辑
如果业务必须写入web.config,必须对所有写操作加全局互斥锁,避免多线程并发写、读写同时执行。
另外注意.NET Framework环境下IIS会在web.config变更后自动回收应用程序池,频繁写入会导致性能抖动、会话丢失,非必要不建议直接修改web.config,可改为使用独立自定义配置文件、数据库或分布式配置中心存储可变配置。
方案3:第三方进程占用的处理
如果排查到是第三方进程持有文件锁,调整第三方工具的执行时机,避开业务高蜂时段,或把web.config加入工具的扫描白名单。
内容的提问来源于stack exchange,提问作者Sagar Jena
相关产品推荐
相关产品推荐

