ASP.NET Core 實戰:將 .NET Core 2.0 項目升級到 .NET Core 2.1

来源:https://www.cnblogs.com/danvic712/archive/2018/11/28/10034749.html
-Advertisement-
Play Games

一、前言 最近一兩個星期,加班,然後回去後弄自己的博客,把自己的電腦從 Windows 10 改到 Ubuntu 18.10 又弄回 Windows 10,原本計劃的學習 Vue 中生命周期的相關知識目前也沒有任何的進展,嗯,罪過罪過。看了眼時間,11月也快要結束了,準備補上一篇如何將我們的 .NE ...


 一、前言

   最近一兩個星期,加班,然後回去後弄自己的博客,把自己的電腦從 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 環境。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Kibana安裝及使用說明 Kibana是一個針對Elasticsearch的開源分析及可視化平臺,用來搜索、查看交互存儲在Elasticsearch索引中的數據。 官方地址:https://www.elastic.co/cn/products/kibana 一、Kibana安裝 1.環境準備 Ki ...
  • 一、什麼是進程 進程(Process)是電腦中的程式關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的電腦結構中,進程是程式的基本執行實體;在當代面向線程設計的電腦結構中,進程是線程的容器。程式是指令、數據及其組織形式的描述,進程是程 ...
  • 最近在學習leal的時候遇到了一點非常迷惑的地方,就是leal是用來取有效地址的,但是為什麼它也可以實現賦值呢?偶然發現一個博客講的不錯,遂自己記錄一下 一個這樣的例子 如果寄存器edx裡面存的值為x,我們知道這句結束之後edx裡面的值會被置為5x+7,但是看起來為什麼是值而不是地址呢? 實際上這之 ...
  • ​ 類型是一個創建或獲取服務實例的類型,這個類型繼承了 這個類型,也是使用了訪問者模式,下麵一一來解析此類 ServiceProviderEngineScope 在解析 之前先看一下 類型,這個類型就可以是一個容器類型,最後實例化的服務對象就緩存在此類之中, 從下麵代碼中可以看出此類實現了 和`IS ...
  • 這一系列文章的內容是從MSDN中COPY過來的,講述的是最簡單的WCF程式示例:如何在控制台應用程式實現和承載WCF服務,以及如何創建、配置和使用WCF客戶端。 文章主體可分為兩部分,分別介紹伺服器端和客戶端的編程實現。細分的話,可以分為六項任務。 伺服器端 定義WCF服務協定(任務一) 這是創建基 ...
  • ABP提供了在啟動時配置模塊的基礎設施和模型。 1.配置ABP 配置ABP是在模塊的PreInitialize方法中完成的,例如: public class SimpleTaskSystemModule : AbpModule { public override void PreInitialize ...
  • ASP.NET Core MVC 提供了基於角色( Role )、聲明( Chaim ) 和策略 ( Policy ) 等的授權方式。在實際應用中,可能採用部門( Department , 本文采用用戶組 Group )、職位 ( 可繼續沿用 Role )、許可權( Permission )的方式進行... ...
  • 寫在前面 上面文章我給大家介紹了Dapper這個ORM框架的簡單使用,大伙會用了嘛!本來今天這篇文章是要講Vue的快速入門的,原因是想在後面的文章中使用Vue進行這個CMS系統的後臺管理界面的實現。但是奈何Vue實現的SPA有一定的門檻,不太適合新手朋友,所以為了照顧大多數人,我準備還是採用asp. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...