(.net6)iis发布DLL,进程无法访问该文件,因为它正在被其他进程使用
问题
虽然最近使用了.net6
,但是公司服务器仍然是windows,于是还是跟往常一样部署在iis.
但是再使用过程中发现iis
发布站点后,无法像以前.net framework
那样可以直接替换DLL文件来发布。会提示进程无法访问该文件,因为它正在被其他进程使用。
经过上海.net群里大石头的指导,发现可以修改webconfig文件来解决这个问
解决思路
在.NET 6 Preview 3
的更新改动中有这样一段描述
IIS 中的浅拷贝支持
我们在 IIS 的 ASP.NET Core
模块中添加了一个新功能,以增加对浅拷贝应用程序程序集的支持。目前,.NET 在 Windows 上运行时锁定了应用程序的二进制文件,使得在应用程序仍在运行时无法替换二进制文件。虽然我们的建议仍然是使用应用程序脱机文件,但我们认识到在某些情况下(例如 FTP 部署)不可能这样做。
在这种情况下,你可以通过自定义 ASP.NET Core
模块处理程序设置来启用浅拷贝。在大多数情况下,ASP.NET Core
应用程序的web.config不在源代码版本控制中,你可以修改它(它们通常是由 SDK 生成的)。你可以添加这个web.config示例来开始。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!-- To customize the asp.net core module uncomment and edit the following section.
For more info see https://go.microsoft.com/fwlink/?linkid=838655 -->
<system.webServer>
<handlers>
<remove name="aspNetCore"/>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModulev2" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout">
<handlerSettings>
<handlerSetting name="experimentalEnableShadowCopy" value="true" />
<handlerSetting name="shadowCopyDirectory" value="../ShadowCopyDirectory/" />
<!-- Only enable handler logging if you encounter issues-->
<!--<handlerSetting name="debugFile" value=".\logs\aspnetcore-debug.log" />-->
<!--<handlerSetting name="debugLevel" value="FILE,TRACE" />-->
</handlerSettings>
</aspNetCore>
</system.webServer>
</configuration>
解决方法
先下载Hosting Bundle
,iis
部署所需要的扩展包,具体看下图。
链接地址 https://dotnet.microsoft.com/en-us/download/dotnet/6.0
修改iis生成的配置文件
添加红框内修改的地方即可。实际测试下来只有Runtime 6.0.3
以上版本才有效
重启IIS或者重启服务器
现在已经可以覆盖DLL,也可以使用FTP的方式来发布文件了