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部署所需要的擴展包,具體看下圖。

image

鏈接地址 https://dotnet.microsoft.com/en-us/download/dotnet/6.0

修改iis生成的配置文件

添加紅框內修改的地方即可。實際測試下來只有Runtime 6.0.3以上版本才有效

image

重啟IIS或者重啟服務器

現在已經可以覆蓋DLL,也可以使用FTP的方式來發布文件了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM