1. 程式人生 > >ASP.NET Core 實戰:將 .NET Core 2.0 專案升級到 .NET Core 2.1

ASP.NET Core 實戰:將 .NET Core 2.0 專案升級到 .NET Core 2.1

 一、前言

   最近一兩個星期,加班,然後回去後弄自己的部落格,把自己的電腦從 Windows 10 改到 Ubuntu 18.10 又弄回 Windows 10,原本計劃的學習 Vue 中生命週期的相關知識目前也沒有任何的進展,嗯,罪過罪過。看了眼時間,11月也快要結束了,準備補上一篇如何將我們的 .NET Core 2.0 版本的程序升級到 .NET Core 2.1 版本,好歹也算多學了一點。

   在上一篇的部落格中(ASP.NET Core 實戰:Linux 小白的 .NET Core 部署之路),試著將我之前寫的 ASP.NET Core 2.0 的專案部署到 Linux 伺服器上,採用的是微軟官方推薦的 Nginx + Supervisor 的方式,評論區的小夥伴提出了使用 Docker 的方式可以更便捷的實現,同時對於新手來說也會更好上手。嗯,新手向的使用 Docker 部署 ASP.NET Core 專案也會在之後的文章中體現。歡迎多多關注啊。

 二、起因

   .NET Core 2.1 釋出於今年的5月30號,從版本號我們可以看出這只是一個小版本的升級,從微軟官方釋出的更新資訊來看,對比於 .NET Core 2.0 版本,更多的是進行效能的優化、對於 .NET Core Runtime、.NET Core tools 的更改以及增加 API 或是增加更多的系統支援。

   在上一篇的文章中,我們在 Linux 伺服器上構建我們的 .NET Core 執行環境時,安裝的是最新版本的 .NET Core Runtime,而部署的程式 .NET Core 版本則是 .NET Core 2.0(專案原始碼地址:

https://github.com/Lanesra712/Danvic.PSU),因為並沒有採取 Docker 部署的緣故,這裡程式與執行環境的版本差異,可能導致某些我們的程式產生某些我們並不能復現的問題,所以,升級我們的程式就顯得很有必要了。

  PS:如果你要在實際的生產專案升級你的 .NET Core 版本,慎重,慎重,再慎重!!!

 三、Step by Step

  1、修改我們的專案目標框架

  在更新 VS 2017 的過程中,我們的 .NET Core 版本也會進行更新,當然,如果你的電腦中沒有安裝 .NET Core 2.1 SDK,則需要你從官網上下載最新版的 SDK 進行安裝。當我們已經安裝好 .NET Core 2.1 SDK 後,就可以將我們原來程式的目標框架更改為 .NET Core 2.1。

  右鍵我們的專案,我們可以直接編輯 csproj 檔案 或者通過開啟屬性選項進行視覺化的修改。其實這裡我們通過屬性頁面進行編輯實質上就是編輯我們的 csproj 檔案。

  同時,為了保持我們的專案框架的一致性,我們需要將我們引用的類庫的目標框架同樣修改成 .NET Core 2.1。

  2、替換 Nuget 包引用

  在 .NET Core 2.1 版本中 微軟將 Microsoft.AspNetCore.All 這個 .NET Core 的基礎 DLL 更換成了 Microsoft.AspNetCore.App,因此,在更新了程式的目標框架後我們還需要將我們程式刪除對於 Microsoft.AspNetCore.All 的引用,同時新增對於 Microsoft.AspNetCore.App 的引用。

  在 Microsoft.AspNetCore.App 中不包含了以下 Nuget package,如果你對於這些 package 有需要的話,你可以在專案中引用這些 package。

Microsoft.AspNetCore.ApplicationInsights.HostingStartup
Microsoft.AspNetCore.AzureAppServices.HostingStartup
Microsoft.AspNetCore.AzureAppServicesIntegration
Microsoft.AspNetCore.DataProtection.AzureKeyVault
Microsoft.AspNetCore.DataProtection.AzureStorage
Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv
Microsoft.AspNetCore.SignalR.Redis
Microsoft.Data.Sqlite
Microsoft.Data.Sqlite.Core
Microsoft.EntityFrameworkCore.Sqlite
Microsoft.EntityFrameworkCore.Sqlite.Core
Microsoft.Extensions.Caching.Redis
Microsoft.Extensions.Configuration.AzureKeyVault
Microsoft.Extensions.Logging.AzureAppServices
Microsoft.VisualStudio.Web.BrowserLink

  在引用 Microsoft.AspNetCore.App 的時候,可能會提示缺少某些依賴項或者提示我們原來引用的 Nuget 包版本不滿足 Microsoft.AspNetCore.App,我們只需要根據提示的錯誤資訊將我們缺少的依賴項新增上或者將不滿足要求的版本升級就可以了。

  例如我在升級 PSU.EFCore 這個類庫中時,發現引用的程式集版本不滿足我們我們使用 2.1.6 版本的 Microsoft.AspNetCore.App ,我們只需要將這些引用的 DLL 進行升級,再安裝我們最新版本的 Microsoft.AspNetCore.App。

  在安裝 .NET Core 2.1 SDK 之後,下列的 tools 已經被包含在最新版本的 .NET Core CLI 中,因此,我們可以在 csproj 檔案中刪除 DotNetCliToolReference 節點下的這些引用的 Nuget 包。

Microsoft.DotNet.Watcher.Tools (dotnet watch)
Microsoft.EntityFrameworkCore.Tools.DotNet (dotnet ef)
Microsoft.Extensions.Caching.SqlConfig.Tools (dotnet sql-cache)
Microsoft.Extensions.SecretManager.Tools (dotnet user-secrets)

  對於 DotNetCliToolReference 節點下的 dotnet-aspnet-codegenerator(用於生成 MVC中的 controllers 和 views 模板) Nuget 包,你同樣可以選擇刪除這個引用,同時使用全域性安裝 tool 來代替它。

dotnet tool install -g dotnet-aspnet-codegenerator

  3、基於 ASP.NET Core 2.1 程式碼慣例的更改

  在 .NET Core 升級到 2.1 版本後,ASP.NET Core 相應的也進行了一些更新,我們建立的模板中的一些基礎程式碼也進行了修改。例如在下面示例中,我們使用 .NET Core 2.0 版本建立的 MVC 專案中的 Program.cs 程式碼結構與使用 .NET Core 2.1 生成的模板程式碼是有一定差異的。

//ASP.NET Core 2.0
namespace WebApp1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }
}
//ASP.NET Core 2.1
namespace WebApp1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
}

  這裡我們按照最新版本的模板程式碼對我們的 Program.cs 程式碼結構進行修改。

  同樣的,在 Startup.cs 檔案中,ASP.NET Core 2.1 版本增加了對於 GDPR 的支援(歐盟的一項政策,當我們需要收集使用者的資料時,必須以「簡潔、透明且易懂的形式,清晰和平白的語言」向用戶說明,例如這裡我們使用了 cookie、session 來儲存使用者的資料,我們就需要提前告知使用者),對於 HTTPS 的重定向支援以及增加了 SetCompatibilityVersion 方法允許應用程式選擇加入或退出ASP.NET MVC Core 2.1+中引入的可能中斷的行為更改(嗯,看了一圈還是不明白到底是幹什麼的)。

  4、其它修改

  在 ASP.NET Core MVC 框架版本的更新中,同樣對於引用的一些 JS 類庫進行了升級,這裡我就不升級了,主要為我們的程式新增對於 GDPR 政策的提示。以及要求我們的程式以 HTTPS 的形式進行訪問。

  首先我們建立一個分佈檢視 _CookieConsentPartial 用來提示我們需要收集使用者的資訊,在 SecretController 控制器中新增一個 Action 用來顯示我們的隱私政策,同時在我們的模板頁面中引用建立的分佈檢視,這裡的樣式就不做任何的調整了,只是做個示例。

@using Microsoft.AspNetCore.Http.Features

@{
    var consentFeature = Context.Features.Get<ITrackingConsentFeature>();
    var showBanner = !consentFeature?.CanTrack ?? false;
    var cookieString = consentFeature?.CreateConsentCookie();
}

@if (showBanner)
{
    <nav id="cookieConsent" class="navbar navbar-default navbar-fixed-top" role="alert">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#cookieConsent .navbar-collapse">
                    <span class="sr-only">Toggle cookie consent banner</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <span class="navbar-brand"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span></span>
            </div>
            <div class="collapse navbar-collapse">
                <p class="navbar-text">
                    Use this space to summarize your privacy and cookie use policy.
                </p>
                <div class="navbar-right">
                    <a asp-controller="Secret" asp-action="Privacy" class="btn btn-info navbar-btn">Learn More</a>
                    <button type="button" class="btn btn-default navbar-btn" data-cookie-string="@cookieString">Accept</button>
                </div>
            </div>
        </div>
    </nav>
    <script>
        (function () {
            document.querySelector("#cookieConsent button[data-cookie-string]").addEventListener("click", function (el) {
                document.cookie = el.target.dataset.cookieString;
                document.querySelector("#cookieConsent").classList.add("hidden");
            }, false);
        })();
    </script>
}
//在網站的首頁(登入頁面)中引用分佈檢視
<partial name="_CookieConsentPartial" />
/// <summary>
/// 隱私政策
/// </summary>
/// <returns></returns>
[AllowAnonymous]
public IActionResult Privacy()
{
    return View();
}

  在之前的步驟中,我們在程式碼中支援了使用 HTTPS 請求訪問,現在我們就可以啟用 SSL 來使我們通過 HTTPS 請求來訪問我們的專案。

 四、總結

   從 .NET Core 2.0 升級到 .NET Core 2.1的整個過程來看,專案整體改動不多,在釋出專案時,我們可以發現,釋出後的專案的大小縮小了很多,同時還提供了對於獨立部署的支援,不用做過多的操作,就可以獲得一些新的優秀特性,總的來說還是很值得升級的。

  注:

  1、依賴部署(FDD):專案依賴於目標伺服器系統上的存在的系統級 .NET Core 環境,釋出後的應用僅包含其自己的程式碼和其它位於 .NET Core 系統級庫外的第三方依賴項。

  2、獨立部署(SCD):釋出後的專案需要包含釋出後的程式所需要的全部元件(.NET Core 環境、第三方依賴項、程式程式碼),不依賴於目標伺服器系統上的 .NET Core 環境。