最近一兩個星期,加班,而後回去後弄本身的博客,把本身的電腦從 Windows 10 改到 Ubuntu 18.10 又弄回 Windows 10,本來計劃的學習 Vue 中生命週期的相關知識目前也沒有任何的進展,嗯,罪過罪過。看了眼時間,11月也快要結束了,準備補上一篇如何將咱們的 .NET Core 2.0 版本的程序升級到 .NET Core 2.1 版本,好歹也算多學了一點。html
在上一篇的博客中(ASP.NET Core 實戰:Linux 小白的 .NET Core 部署之路),試着將我以前寫的 ASP.NET Core 2.0 的項目部署到 Linux 服務器上,採用的是微軟官方推薦的 Nginx + Supervisor 的方式,評論區的小夥伴提出了使用 Docker 的方式能夠更便捷的實現,同時對於新手來講也會更好上手。嗯,新手向的使用 Docker 部署 ASP.NET Core 項目也會在以後的文章中體現。歡迎多多關注啊。git
.NET Core 2.1 發佈於今年的5月30號,從版本號咱們能夠看出這只是一個小版本的升級,從微軟官方發佈的更新信息來看,對比於 .NET Core 2.0 版本,更多的是進行性能的優化、對於 .NET Core Runtime、.NET Core tools 的更改以及增長 API 或是增長更多的系統支持。github
在上一篇的文章中,咱們在 Linux 服務器上構建咱們的 .NET Core 運行環境時,安裝的是最新版本的 .NET Core Runtime,而部署的程序 .NET Core 版本則是 .NET Core 2.0(項目源碼地址:https://github.com/Lanesra712/Danvic.PSU),由於並無採起 Docker 部署的緣故,這裏程序與運行環境的版本差別,可能致使咱們的程序產生某些咱們並不能復現的問題,因此,升級咱們的程序就顯得頗有必要了。sql
PS:若是你要在實際的生產項目升級你的 .NET Core 版本,慎重,慎重,再慎重!!!服務器
在更新 VS 2017 的過程當中,咱們的 .NET Core 版本也會進行更新,固然,若是你的電腦中沒有安裝 .NET Core 2.1 SDK,則須要你從官網上下載最新版的 SDK 進行安裝。當咱們已經安裝好 .NET Core 2.1 SDK 後,就能夠將咱們原來程序的目標框架更改成 .NET Core 2.1。cookie
右鍵咱們的項目,咱們能夠直接編輯 csproj 文件 或者經過打開屬性選項進行可視化的修改。其實這裏咱們經過屬性頁面進行編輯實質上就是編輯咱們的 csproj 文件。session
同時,爲了保持咱們的項目框架的一致性,咱們須要將咱們引用的類庫的目標框架一樣修改爲 .NET Core 2.1。框架
在 .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
在 .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+中引入的可能中斷的行爲更改(嗯,看了一圈仍是不明白究竟是幹什麼的)。
在 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的整個過程來看,項目總體改動很少,在發佈項目時,咱們能夠發現,發佈後的項目的大小縮小了不少,同時還提供了對於獨立部署的支持,不用作過多的操做,就能夠得到一些新的優秀特性,總的來講仍是很值得升級的。
注:
一、依賴部署(FDD):項目依賴於目標服務器系統上的存在的系統級 .NET Core 環境,發佈後的應用僅包含其本身的代碼和其它位於 .NET Core 系統級庫外的第三方依賴項。
二、獨立部署(SCD):發佈後的項目須要包含發佈後的程序所須要的所有組件(.NET Core 環境、第三方依賴項、程序代碼),不依賴於目標服務器系統上的 .NET Core 環境。