1. 程式人生 > 其它 >iis釋出DLL,程序無法訪問該檔案,因為它正在被其他程序使用

iis釋出DLL,程序無法訪問該檔案,因為它正在被其他程序使用

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