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

多请求并发保存web.config时报“进程无法访问文件,正被另一进程占用”错误

问题成因
  • 你当前的代码没有做任何并发控制,多请求同时触发时,多个线程会同时调用Configuration.Save()写web.config文件。文件系统的写入本身是排他锁机制,同一时间只允许一个进程/线程操作文件,其他线程抢不到锁就会抛出你遇到的占用错误。
  • 额外补充:web.config是ASP.NET应用的核心配置文件,每次修改默认都会触发应用池回收,会直接导致当前所有会话丢失、缓存清空、请求阻塞,你这个每次请求就改web.config的设计本身就不符合常规开发规范。
解决方法

1. 加互斥锁解决冲突(仅适合极低频率修改场景)

如果你的配置修改频率非常低(比如每天不到10次),可以直接加锁保证同一时间只有一个线程操作配置文件,示例实现:

// 定义全局静态锁对象
private static readonly object _configWriteLock = new object();

// 配置修改逻辑
lock (_configWriteLock)
{
    Configuration config = ConfigurationManager.OpenExeConfiguration(string.Empty);
    ConfigurationSection section = config.GetSection(_appSettings);
    // 此处写你修改配置节的逻辑
    config.Save(ConfigurationSaveMode.Modified);
    // 强制刷新内存中的配置,避免后续读取到旧值
    ConfigurationManager.RefreshSection(_appSettings);
}

这个方案只能解决文件占用报错,还是会触发应用池回收,不适合高频修改场景。

2. 替换动态配置的存储方案(最推荐)

彻底放弃修改web.config的设计,把需要频繁更新的动态配置转移到其他存储:

  • 自定义JSON/XML配置文件:自己读写自定义配置文件,加锁操作就不会触发应用重启
  • 关系型数据库:把动态配置存在表里,读写性能足够支撑普通并发量
  • 分布式缓存:如果是分布式部署的服务,用Redis这类缓存存动态配置最合适
    这个方案从根本上解决了web.config修改的所有问题,性能和稳定性都符合生产环境要求。

3. 临时兼容方案(不推荐,仅应急用)

如果暂时改不了核心逻辑,可以给Save方法加强制覆写参数,忽略冲突直接写入:

config.Save(ConfigurationSaveMode.Modified, true);

这个方案有概率丢修改,只能临时用,不建议长期留着。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:06:04