Core 2.0 的dll即時更新、https、依賴包變更問題及解決

來源:互聯網
上載者:User

標籤:limits   ext   runtime   最新   content   window   .net   native   更新   

 

今天所有開發環境已經遷移到mac OS下的Visual Studio Code + 命令列編譯發布,而運行伺服器是CentOS7,和windows沒什麼關聯了。 只要你Relese編譯並在本地有一個與伺服器相同的運行環境中運行成功了,遷移到真實伺服器不會有什麼難度。

 

下面是遷移到 2.0 版本之後遇到的3個問題及解決辦法

 

 1:有時候dll不會即時更新(不是每次都會遇到,並且這事情僅發生在Centos上)有時候你需要把與dll相關的所有邊緣檔案一同傳上去(例如配套的xxx.config.json、xxx.runtime.json),它才會真正在重啟應用程式後立即更新(注意這裡是重啟應用程式),否則重啟程式無效,這個情況一旦出現,哪怕是重啟系統後(注意這裡是重啟系統),它依然載入過去的老dll,過幾個小時後再次手動重啟系統才會載入最新dll。

雖然道理上是說不通的,但這是我真實遇到的案例,原因嘛,不知道,也沒空折騰,這類機制可以從側面得到證明: 你正常運行著服務的時候,可以去運行目錄裡面更新、甚至刪除dll,如果不重啟,正在啟動並執行程式不會受到影響,說明linux版本的載入機制不同於mac和windows,它可能是把現有dll全都複製到某個地方後,並且要同時比較配套json檔案的時間戮和內容後才會運行。

別的linux會不會也這樣,不清楚。

 

 

2:https配置不同以往

Kestrel已經演化成獨立完整的伺服器,應對真實請求沒什麼問題了, 但是1.1及以下版本載入https的方法已經不適用,需要改為如下的辦法:

            var WebServer = new WebHostBuilder()                        .UseKestrel(options => options.Listen(IPAddress.Any, servicePort, listenOptions =>            {                listenOptions.UseHttps(new X509Certificate2("你的.pfx", "pfx檔案的密碼"));                options.Limits.MaxConcurrentConnections = 100;                options.Limits.MaxConcurrentUpgradedConnections = 100;                options.Limits.MaxRequestBodySize = 10 * 1024;            }))            .UseContentRoot(AppContext.BaseDirectory)            .UseStartup<Startup>()            .Build();            WebServer.Run();

 

相信很多人通過LetsEncript來擷取https,原始得到的密鑰不是pfx格式,隨便找個線上轉換就可以了。

 

3, 依賴包變更

我沒有用過 preview 3, 而是從preview2遷移到正式版2.0的, 可能你會和我一樣遷移後遇到載入View的時候,出現“Cannot find compilation library location for package ‘Microsoft.Win32.Registry” , 晃眼一看這包的命名,嚇死人,實際它和win32沒什麼必然關聯。解決辦法:

在csproj中添加:

<MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>

以及:

   <PackageReference Include="Microsoft.Win32.Registry" Version="4.4.0" />

確保編譯發布後你的運行目錄下存在refs檔案夾,裡面都是System.xxxx、Microsoft.xxx 這些基本dll,就行了。

這僅是其中一例,我在Google搜尋這個問題的時候,還發現別人遇到了類似的其它包Cannot find,道理都一樣。

 

下面是尚未解決的,等待各位探討

 

1,目前我是把項目編譯為全平台通用的dll,mac編譯出來的dll放到centos運行(放到windows也行),實際依賴包儲存在系統安裝的CLR中。另有一種辦法是編譯過程中指定runtime,針對centos編譯,得到完全二進位、綠色安全部署的完整運行包(容量會很大),可以扔到生產環境中直接就運行了,這種情況我只在1.0 beta的時候在windows上成功編譯出來,現在mac沒法編譯, 命令列假死20分鐘沒反應。

 

2,想嘗試Visual Studio for Mac,但是搞不定Release發布,GUI中沒法配置,設定為Release後,晃眼換個視窗再回去又變回Debug(我明白windows visual studio中統一在解決方案中配置的道理,沒用),手動修改csproj的相關配置為Release也沒用,就放棄了(當然這是我個人能力不行,相信別人是可以的)。

 

3, 我之所以選擇CentOS 7 是因為它有一個Minimal版本,記憶體等資源要求較低,並不是因為它是Redhat的雙胞胎,如果哪位同好發現還有更好性價比的Linux,還望推薦一份,先行謝過。

 

4,core雖然正式跨平台了,但是微軟還有另一件核武器吧: .net native 還有沒有下文? 自從看到僅支援 windows phone 之後,就無聲無息了。

 

剛正式發布一天,可能還會有更多遷移問題待發現

 

Core 2.0 的dll即時更新、https、依賴包變更問題及解決

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.