Windows升级后发布ASP.NET Core项目提示w3wp.exe锁定文件如何解决
IIS部署ASP.NET Core升级系统后发布文件被w3wp.exe锁定解决方案
根因说明
该问题由Windows 10 21H2版本的IIS默认策略变更触发:系统升级后应用程序池默认开启重叠回收、AlwaysRunning启动模式,旧w3wp进程未完全释放文件锁时新进程已启动,双重占用站点目录下的DLL文件,导致发布时重试10次后仍然失败。
永久解决方案
方案1:禁用应用程序池重叠回收(优先级最高,适配所有场景)
- 打开IIS管理器,定位到对应站点所属的应用程序池,右键选择「高级设置」
- 在「进程模型」分类下找到禁用重叠回收选项,设置为
True - 在「回收」分类下勾选所有生成回收事件日志的选项,方便后续排查回收异常
- 保存配置后重启对应应用程序池即可
方案2:开启ASP.NET Core影子复制功能(无需修改IIS配置,适配所有部署场景)
ASP.NET Core 3.0及以上版本支持影子复制机制,运行时会将程序集加载到临时目录,不会锁定站点根目录的原始文件:
- 打开项目根目录的
web.config文件,在aspNetCore节点下添加影子复制配置,示例如下:
<aspNetCore processPath="dotnet" arguments=".\你的项目.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess"> <handlerSettings> <handlerSetting name="shadowCopyEnabled" value="true" /> <handlerSetting name="shadowCopyTempDirectory" value="%TEMP%\你的项目标识\ShadowCopy" /> </handlerSettings> </aspNetCore>
- 保存配置后重新发布项目即可生效
方案3:配置发布流程自动启停应用程序池(适配本地调试发布场景)
可以在Visual Studio的发布配置中加入自动执行的命令,发布前停止应用程序池,发布完成后自动重启,从根本上避免进程占用:
- 打开项目对应的发布配置文件(后缀为
.pubxml),在Project节点内添加如下配置:
<Target Name="StopIISAppPool" BeforeTargets="BeforePublish"> <Exec Command="%windir%\system32\inetsrv\appcmd stop apppool /apppool.name:你的应用程序池名称" /> </Target> <Target Name="StartIISAppPool" AfterTargets="AfterPublish"> <Exec Command="%windir%\system32\inetsrv\appcmd start apppool /apppool.name:你的应用程序池名称" /> </Target>
- 注意需要以管理员身份运行Visual Studio,才能正常执行IIS管理命令
方案4:关闭应用程序预热功能
21H2默认开启的应用预热功能会在站点重启后自动启动w3wp进程,可能提前占用文件:
- 打开对应应用程序池的高级设置,将「启动模式」设置为
OnDemand - 选中对应站点,打开「配置编辑器」,定位到
system.webServer/applicationInitialization节点,将doAppInitAfterRestart设置为False
验证方式
修改配置后重启IIS服务,连续执行3次全量发布操作,无文件占用报错、w3wp进程无重复启动现象即为配置生效。
内容的提问来源于stack exchange,提问作者user222137
相关产品推荐
相关产品推荐

