筆記:ASP.NET Core 2.2 升級 3.1 經驗一則
5 |
.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 註冊與設定方式有些改變,步驟稍多:
- 修改 global.json (原本 version = 2.2.207)
{ "sdk": { "version": "3.0.100" } }
- 將專案切換成 .NET Core 3,我選擇用 Visual Studio 2019 操作:
- csproj 我只先依據文件移除 Microsoft.AspNetCore.App 以及 Microsoft.AspNetCore.Rewrite,其餘維持不動,有必要再調整:
- 某個 Controller 不知何故加了 using Microsoft.AspNetCore.Mvc.Internal,3.0 不支援,移掉也沒出錯,直接刪除。
- Startup.cs 修改
ConfigurationServices()
Configuration()//2.2寫法 //services.AddMvc() // .SetCompatibilityVersion(CompatibilityVersion.Version_2_1); //3.0寫法 services.AddRazorPages();
//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(); });
- 將所有 IHostingEnvironment 換成 IWebHostEnvironment,Startup.cs 增加 using Microsoft.Extensions.Hosting; 以便使用 env.IsDevelopment()。
- 出現
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:
- 再遇到錯誤
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 預覽版本後,問題排除。 - 完成以上動作後,在本機測試已可正確瀏覽文章:
順便打個廣告,大家如果想訂閱本部落格非技術類文章或聽我閒聊瞎扯,歡迎追蹤我的第二臉書專頁 - 黑暗後花園 (上圖黃色標示處),並記得按讚並分享給你所~~~有~~~的朋友。(黃大謙手勢) - 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 的變化較小,升級相對簡單:
- 專案 Target Framework 設定為 3.1:
- Publish Profile 改 netcoreapp3.1
- 搞定收工。
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, 謝,已修正。