(.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的方式來發布文件了
