關於Core發布到IIS的熱發布問題,或者覆蓋dll文件的時候會報錯"文件已在另一個程序中打開",也就是無法覆蓋程序的問題,經過百度和分析總結以下幾種方案:
一、使用app_offline.htm文件,這個方案網上最多:
1.具體步驟:
1)在發布路徑新建一個文件夾"UpdateFiles"
2)文件夾"UpdateFiles"里面放一個app_offline.htm文件,這個文件是網站處於離線狀態的時候的返回給客戶端的頁面內容
3)文件夾"UpdateFiles"里面放一個"PublishFiles"文件夾,這個文件夾里面放需要發布的文件
4)在發布路徑下面新建一個"pubish.bat"文件,里面輸入如下內容:其實就是先復制app_offline.htm文件到發布路徑,讓網站處於離線狀態,然后覆蓋發布的文件,再刪除pp_offline.htm文件,讓網站恢復在線狀態
@echo off
call xcopy %~dp0UpdateFiles\app_offline.htm %~dp0
call xcopy %~dp0UpdateFiles\PublishFiles %~dp0 /s /e /Y
del %~dp0app_offline.htm
pause
2.利弊分析:
好處:
1.實現簡單
2.不用開發
弊端:
1.復制app_offline.htm文件到發布路徑之后,網站不能立即結束,需要等最后的請求結束,才能復制,不然以上腳本復制的時候會失敗
2.復制app_offline.htm文件到發布路徑之后,時沒有結束的請求返回的結果會最終會是空白內容,也即會是失敗,這樣會造成客戶端發布的時候偶發性的失敗問題
3.覆蓋文件期間,網站處於離線狀態,無法正常訪問
二、改文件名字,然后復制發布程序,然后退出網:
來源:https://bbs.csdn.net/topics/395986630
1.具體步驟:
如下代碼,在一個控制器創建一個如下的方法,然后需要更新的時候Post這個方法就行。以下代碼沒有具體測試過,只測試過可以修改文件名字和application.StopApplication();會退出網站,所以應該是可行的。
[HttpPost] public IActionResult Update([FromServices]IHostApplicationLifetime application) { //獲取程序的工作目錄路徑,依賴注入 IWebHostEnvironment var web = WebHost.ContentRootPath; //// 改名方法-假設項目的dll 為 WebApplication1.dll FileInfo fi = new FileInfo(Path.Combine(web, "WebApplication1.dll")); //// 改為 a1234 fi.MoveTo(Path.Combine(web, "a1234.dll")); //要復制的新文件路徑-你的新dll 路徑 可以是下載或者復制或移動 string pLocalFilePath = Path.Combine(WebHost.WebRootPath, "css", "WebApplication1.dll"); //將新文件復制過去基目錄 string pSaveFilePath = Path.Combine(web, "WebApplication1.dll"); if (System.IO.File.Exists(pLocalFilePath)) { System.IO.File.Copy(pLocalFilePath, pSaveFilePath, true); //復制成功后, 殺死當前的進程=相當於重啟了 依賴注入 IHostApplicationLifetime application.StopApplication(); } return Content("ok"); }
2.利弊分析:
好處:
1.基本可以實現IIS的熱發布
弊端:
1.application.StopApplication();之后,當時沒有結束的請求返回的結果會最終會是空白內容,也即會是失敗,這樣會造成客戶端發布的時候偶發性的失敗問題
2.現稍微復雜,需用開發
三、使用使用網關(例如ocelot)或負載均衡(nginx)軟件實現(推薦):
1.具體實現:
這個還沒有來得及具體驗證,不過理論上是比較完美的解決方案,但實現起來有點復雜,其實就是利用網關(例如ocelot)或負載均衡(nginx)軟件的高可用功能來實現,可以IIS中部署2個相同的網站服務,然后發布的時候一個個發布更新網站,更新服務的時候"優雅"的停止(nginx好像直接命令就可以實現),這樣就可以在不影響客戶端的情況下更新網站了。當然也可以用多服務器來實現高可用。
2.利弊分析:
好處:
1.比較完美的實現熱發布,實現高可用
弊端:
1.需要搭建Consul,部署2個或多個網站
本來剛接觸Core,希望有經驗的大佬推薦更加完善的解決方案。