Core在IIS的熱發佈問題或者報錯文件已在另外一個程序中打開

關於Core發佈到IIS的熱發佈問題,或者覆蓋dll文件的時候會報錯"文件已在另外一個程序中打開",也就是沒法覆蓋程序的問題,通過百度和分析總結如下幾種方案:css

1、使用app_offline.htm文件,這個方案網上最多:

1.具體步驟:

1)在發佈路徑新建一個文件夾"UpdateFiles"web

2)文件夾"UpdateFiles"裏面放一個app_offline.htm文件,這個文件是網站處於離線狀態的時候的返回給客戶端的頁面內容服務器

3)文件夾"UpdateFiles"裏面放一個"PublishFiles"文件夾,這個文件夾裏面放須要發佈的文件app

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.實現簡單spa

2.不用開發.net

弊端:

1.複製app_offline.htm文件到發佈路徑以後,網站不能當即結束,須要等最後的請求結束,才能複製,否則以上腳本複製的時候會失敗code

2.複製app_offline.htm文件到發佈路徑以後,時沒有結束的請求返回的結果會最終會是空白內容,也即會是失敗,這樣會形成客戶端發佈的時候偶發性的失敗問題htm

3.覆蓋文件期間,網站處於離線狀態,沒法正常訪問

2、改文件名字,而後複製發佈程序,而後退出網:

來源: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.現稍微複雜,需用開發

3、使用Consul這種服務管理軟件(推薦):

1.具體實現:

這個尚未來得及具體去Ⅹ,不過理論上是比較完美的解決方案,但實現起來有點複雜,其實就是利用Consul的高可用功能來實現,能夠IIS中部署2個相同的網站服務,而後發佈的時候一個個發佈更新網站,更一個的時候,贊停另外一個,這樣就能夠在不影響客戶端的狀況下更新網站了。固然也能夠用多服務器來實現高可用。

2.利弊分析:

好處:

1.比較完美的實現熱發佈,實現高可用

弊端:

1.須要搭建Consul,部署2個或多個網站

 

原本剛接觸Core,但願有經驗的大佬推薦更加完善的解決方案。

相關文章
相關標籤/搜索