.NET Core 3.1 LTS (Long Term Support) 已在 2019/12/3 正式釋出,依我的觀點 LTS 是作為企業解決方案選項的重要條件,.NET Core 3.1 LTS 的問市意味在工作上可以放心大膽用下去囉。(補充:.NET Core 3.1 的下一版將會更名為 .NET 5.0,將在 2020/11 推出,再下一版則為 .NET 6.0 LTS 在 2021/11 問市,未來則遵循單數為 Current 版,雙數版號為 LTS 版的規則。延伸閱讀:.NET Core 3.0 正式版! 告別 .NET Framework ,迎向 .NET 5 )

我的部落格平台目前使用 .NET Core 2.2.207,伴隨新版推出,.NET Core 2.2 將於 2019/12/23 結束支援 (EOS, End of Support) 參考。嚴格來說,繼續使用不致有立即危險,但行有餘力升級才是王道。另一方面,我也想積極累積 .NET Core 3.x 開發經驗,趁著假日就來升級吧!

.NET Core 2.2 升級 3.0 的官方參考文件為 從 ASP.NET Core 2.2 遷移至 3.0,理論上按表操課就會成功,實際只遇到一些零星問題,以下是我的升級過程記錄:

2.2 升級 3.0

2.x 到 3.0 在 Service 註冊與設定方式有些改變,步驟稍多:

  1. 修改 global.json (原本 version = 2.2.207)
     {
       "sdk": {
     	"version": "3.0.100"
       }
     }
    
  2. 將專案切換成 .NET Core 3,我選擇用 Visual Studio 2019 操作:
  3. csproj 我只先依據文件移除 Microsoft.AspNetCore.App 以及 Microsoft.AspNetCore.Rewrite,其餘維持不動,有必要再調整:
  4. 某個 Controller 不知何故加了 using Microsoft.AspNetCore.Mvc.Internal,3.0 不支援,移掉也沒出錯,直接刪除。
  5. Startup.cs 修改
    ConfigurationServices()
    //2.2寫法
    //services.AddMvc()
    //    .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    //3.0寫法
    services.AddRazorPages();
    
    Configuration()
    //2.2寫法
    //app.UseMvc(routes =>
    //{
    //    routes.MapRoute(
    //        name: "default",
    //        template: "{controller=Blog}/{action=Index}/{id?}");
    //});
    //3.0寫法
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Blog}/{action=Index}/{id?}"
        );
        endpoints.MapRazorPages();
    });
    
  6. 將所有 IHostingEnvironment 換成 IWebHostEnvironment,Startup.cs 增加 using Microsoft.Extensions.Hosting; 以便使用 env.IsDevelopment()。
  7. 出現 System.TypeLoadException: 'Could not load type 'Microsoft.AspNetCore.Antiforgery.Internal.CryptographyAlgorithms' from assembly 'Microsoft.AspNetCore.Antiforgery, Version=3.0.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.' 爬文得知是 LigerShark.WebOptimizer 版本問題。 使用 NuGet 管理員升級 LigerShart.WebOptimizer.Core 到 3.x:

    升級時有一大票套件需要移除、升降版及新增,其中包含 System.Text.Json
  8. 再遇到錯誤 System.MissingMethodException: 'Method not found: 'Microsoft.Extensions.FileProviders.IFileProvider WebOptimizer.AssetExtensions.GetFileProvider(WebOptimizer.IAsset, Microsoft.AspNetCore.Hosting.IHostingEnvironment)'.'。 看起來仍是 LigerShark 問題,有人回報類似問題但無解答。 先前我排除了 NuGet Prerelease 版套件,故只升級 LigerShark.WebOptimizer.Core 到 3.0.250,選取「Include prerelease」更新 LigerShark.WebOptimizer.Sass 到 3.x 預覽版本後,問題排除。
  9. 完成以上動作後,在本機測試已可正確瀏覽文章:

    順便打個廣告,大家如果想訂閱本部落格非技術類文章或聽我閒聊瞎扯,歡迎追蹤我的第二臉書專頁 - 黑暗後花園 (上圖黃色標示處),並記得按讚並分享給你所~~~有~~~的朋友。(黃大謙手勢)
  10. Publish 時遇到以下錯誤 'Darkblog.Core\src\obj\project.assets.json' doesn't have a target for '.NETCoreApp,Version=v2.2'. Ensure that restore has run and that you have included 'netcoreapp2.2' in the TargetFrameworks for your project.
    爬文得知這是因為 Publish Profile 沒修改,開啟 Publish 設定畫面,Target Framework 會自動跳到 netcorapp3.0,儲存再試就 OK 了。

    如要手動修改,它位於 Properties/PublishProfiles/*.pubxml。

3.0 升級 3.1

3.0 到 3.1 的變化較小,升級相對簡單:

  1. 專案 Target Framework 設定為 3.1:
  2. Publish Profile 改 netcoreapp3.1
  3. 搞定收工。

Docker

Dockerfile 取得 .NET Core 2.x Docker Image 的來源格式[原本為 microsoft/dotnet:2.1-aspnetcore-runtime]((/blog/aspnetcore-docker-notes1/),3.1 不是把 2.1 改成 3.1,而是換成 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1,除此外其他不變。

小結

經過上述程序,我就把部落格平台從 .NET Core 2.2 升到 3.1 了,比預期的順利。但不排除有其他未爆小地雷,決定觀察一陣子再上線。

Experience of upgrading my blog web application from ASP.NET Core 2.2 to 3.1.


Comments

# by 卡比

好好

# by Steven

請問黑大blog 承租的主機是哪一家的? 找了google plaform 有點不太會用~~

# by Jeffrey

to Steven, 如果要跑 ASP.NET Core on Linux,簡單服務開最小的 Azure VM 就能跑。https://azure.microsoft.com/zh-tw/free/

# by Ike

回報錯字 XD csproj 我只先依據文件移除 Mcirosoft.AspNetCore.App csproj 我只先依據文件移除 Microsoft.AspNetCore.App

# by Jeffrey

to lke, 謝,已修正。

Post a comment