2023年8月7日 星期一

.Net Core Shadow-copying解決發佈至IIS時dll無法覆蓋問題

.net core更新經常都需要停用應用程式集區
此時最容易造成503 service unavailable
找了幾篇文章有個功能Shadow-copying但.net6開始才有
整理了使用流程如下
1.修改專案改成.net6以上
2.修改或加入web.conifg,內容,xxxShadowCopyDirectory的部分依您路徑需求修改,xxx.dll為您會被鎖的的那個檔通常是專案名稱,若不知道可在發布後找一下
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>      
      <handlers>
	     <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="%LAUNCHER_PATH%" arguments="./xxx.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout">
        <handlerSettings>
          <handlerSetting name="experimentalEnableShadowCopy" value="true" />
          <handlerSetting name="shadowCopyDirectory" value="../xxxShadowCopyDirectory/" />          
        </handlerSettings>
      </aspNetCore>
    </system.webServer>
  </location>
</configuration>
3.IIS上安裝Hosting Bundle,需重新啟動Server
4.發佈專案,發佈時特別注意,如會直接發佈到IIS上資料夾,刪除現有檔案要設定為false
5.只要檔案蓋過IIS上的目錄就會自動觸發,xxxShadowCopyDirectory資料夾中就會多一個版本
6.experimentalEnableShadowCopy在.net7後變成enableShadowCopy
參考資料
ASP.​NET Core in .NET 6 - Shadow-copying in IIS
如何啟用 ASP.NET Core 6.0 部署到 IIS 的陰影複製 (Shadow-copying) 功能
.NET6 ShadowCopy
下载 .NET 6.0