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 文件。

640?wx_fmt=png

  同时,为了保持我们的项目框架的一致性,我们需要将我们引用的类库的目标框架同样修改成 .NET Core 2.1。

640?wx_fmt=png

  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.HostingStartupMicrosoft.AspNetCore.AzureAppServices.HostingStartupMicrosoft.AspNetCore.AzureAppServicesIntegrationMicrosoft.AspNetCore.DataProtection.AzureKeyVaultMicrosoft.AspNetCore.DataProtection.AzureStorageMicrosoft.AspNetCore.Server.Kestrel.Transport.LibuvMicrosoft.AspNetCore.SignalR.RedisMicrosoft.Data.SqliteMicrosoft.Data.Sqlite.CoreMicrosoft.EntityFrameworkCore.SqliteMicrosoft.EntityFrameworkCore.Sqlite.CoreMicrosoft.Extensions.Caching.RedisMicrosoft.Extensions.Configuration.AzureKeyVaultMicrosoft.Extensions.Logging.AzureAppServicesMicrosoft.VisualStudio.Web.BrowserLink


  在引用 Microsoft.AspNetCore.App 的时候,可能会提示缺少某些依赖项或者提示我们原来引用的 Nuget 包版本不满足 Microsoft.AspNetCore.App,我们只需要根据提示的错误信息将我们缺少的依赖项添加上或者将不满足要求的版本升级就可以了。

  例如我在升级 PSU.EFCore 这个类库中时,发现引用的程序集版本不满足我们我们使用 2.1.6 版本的 Microsoft.AspNetCore.App ,我们只需要将这些引用的 DLL 进行升级,再安装我们最新版本的 Microsoft.AspNetCore.App。

640?wx_fmt=png

  在安装 .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

640?wx_fmt=png

  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.0namespace 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.1namespace 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 代码结构进行修改。

640?wx_fmt=png

640?wx_fmt=png

  同样的,在 Startup.cs 文件中,ASP.NET Core 2.1 版本增加了对于 GDPR 的支持(欧盟的一项政策,当我们需要收集用户的数据时,必须以「简洁、透明且易懂的形式,清晰和平白的语言」向用户说明,例如这里我们使用了 cookie、session 来存储用户的数据,我们就需要提前告知用户),对于 HTTPS 的重定向支持以及增加了 SetCompatibilityVersion 方法允许应用程序选择加入或退出ASP.NET MVC Core 2.1+中引入的可能中断的行为更改(嗯,看了一圈还是不明白到底是干什么的)。

640?wx_fmt=png

640?wx_fmt=png

  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();
}


640?wx_fmt=png

  在之前的步骤中,我们在代码中支持了使用 HTTPS 请求访问,现在我们就可以启用 SSL 来使我们通过 HTTPS 请求来访问我们的项目。

640?wx_fmt=png

 四、总结

   从 .NET Core 2.0 升级到 .NET Core 2.1的整个过程来看,项目整体改动不多,在发布项目时,我们可以发现,发布后的项目的大小缩小了很多,同时还提供了对于独立部署的支持,不用做过多的操作,就可以获得一些新的优秀特性,总的来说还是很值得升级的。

640?wx_fmt=png

640?wx_fmt=png

  注:

  1、依赖部署(FDD):项目依赖于目标服务器系统上的存在的系统级 .NET Core 环境,发布后的应用仅包含其自己的代码和其它位于 .NET Core 系统级库外的第三方依赖项。

  2、独立部署(SCD):发布后的项目需要包含发布后的程序所需要的全部组件(.NET Core 环境、第三方依赖项、程序代码),不依赖于目标服务器系统上的 .NET Core 环境。 

原文地址: https://www.cnblogs.com/danvic712/p/10034749.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图论:dij算法优化:双端队列及详细证明

dij原来的写法请移步这里 首先&#xff0c;让我们举一个洛谷中的情境 这题中&#xff0c;我们可以二分mid答案&#xff0c;小于等于mid的边权是0&#xff0c;大于的是1&#xff0c;再计算最短路是否<k&#xff1b; 那么在这样边权只有0和1的时候&#xff0c;dij算法是否可以…

2021牛客暑期多校训练营4 B-Sample Game(概率DP)

B-Sample Game ding_ning123大佬题解 注&#xff1a;上述题解图片来自ding_ning123大佬题解 Code #include<bits/stdc.h> using namespace std; using lllong long; template <class Tint> T rd() {T res0;T fg1;char chgetchar();while(!isdigit(ch)) {if(ch-…

P6775-[NOI2020]制作菜品【贪心,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P6775 题目大意 nnn种原材料&#xff0c;第iii个有did_idi​个&#xff0c;mmm道菜品都需要kkk个原料而且每道菜最多只能用两种材料。 要求构造方案使得满足条件。 1≤n≤500,n−2≤m≤5000,1≤k≤5000,(∑i1ndi)mk1\leq n\l…

牛客题霸 [螺旋矩阵] C++题解/答案

牛客题霸 [螺旋矩阵] C题解/答案 题目描述 给定一个m x n大小的矩阵&#xff08;m行&#xff0c;n列&#xff09;&#xff0c;按螺旋的顺序返回矩阵中的所有元素。 题解&#xff1a; 其实就是模拟过程&#xff0c;先往左走&#xff0c;走到头向下走&#xff0c;到头后向左走…

递推:Ybtoj: D.4 序列个数

传送门 这题需要使用数形结合的思想 用一个矩形表示序列&#xff0c;若(i&#xff0c;j)点为1&#xff0c;表示第i个数是j 比如&#xff1a; 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 表示的序列是&#xff1a;41235 显然每行和每列都只能有一个1 回到本题&#xf…

codeforces280 C. Game on Tree(期望)

C. Game on Tree 单独考虑每个点对答案的贡献。 删除一个点的方案是删除它或者它的祖先&#xff0c;那么对答案的贡献是1depu\frac 1 {\text{dep}_u}depu​1​ #include<cstdio> #include<vector>int n; std::vector<int> g[100005]; int dep[100005]; vo…

OrchardCore 如何实现模块化( Modular )和 Multi-Tenancy

一、概述通常我们会在 Startup 类通过 void ConfigureServices(IServiceCollection services) 配置应用的服务。常见的形如 AddXXX 的方法&#xff0c;实际上调用的都是 IServiceCollection 或直接说是 ServiceCollection 的 AddSingleton 等方法。调用ApplicationBuilder 的 R…

P2350-[HAOI2012]外星人【线性筛】

正题 题目链接:https://www.luogu.com.cn/problem/P2350 题目大意 给出NNN质因数分解之后的结果&#xff0c;求每次Nφ(N)N\varphi(N)Nφ(N)&#xff0c;多少次后N1N1N1。 N∏i1mpiqi,1≤m≤2000,1≤pi≤105,1≤qi≤109N\prod_{i1}^mp_i^{q_i},1\leq m\leq 2000,1\leq p_i\le…

牛客题霸 [ 最长回文子串] C++题解/答案

牛客题霸 [ 最长回文子串] C题解/答案 题目描述 对于一个字符串&#xff0c;请设计一个高效算法&#xff0c;计算其中最长回文子串的长度。 给定字符串A以及它的长度n&#xff0c;请返回最长回文子串的长度。 题解&#xff1a; 两个方法&#xff1a; 一个是经典暴力&#…

强连通分量:洛谷P3387 模板:缩点

传送门 顾名思义&#xff0c;模板awa #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <string> #include <queue> #include <vector> #define ll long long usi…

2021牛客暑期多校训练营4 E-Tree Xor(异或+思维+区间交 or Trie树)

E-Tree Xor 首先不考虑区间限制条件&#xff0c;我们给定其中一个点的权值后&#xff0c;那么其他点的权值也就确定。比如 val10\text{val}_10val1​0&#xff0c;即可通过变得限制求出其他点valu\text{val}_uvalu​&#xff0c;而且不难发现如果val10⊕a\text{val}_10\oplus …

【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析

上篇文章我介绍了如何在网关上实现客户端自定义限流功能&#xff0c;基本完成了关于网关的一些自定义扩展需求&#xff0c;后面几篇将介绍基于IdentityServer4&#xff08;后面简称Ids4&#xff09;的认证相关知识&#xff0c;在具体介绍ids4实现我们统一认证的相关功能前&…

[科技]Loj#6564-最长公共子序列【bitset】

正题 题目链接:https://loj.ac/p/6564 题目大意 给两个序列a,ba,ba,b求它们的最长公共子序列。 1≤n,m,ai,bi≤71041\leq n,m,a_i,b_i\leq 7\times 10^41≤n,m,ai​,bi​≤7104 解题思路 无意间看到的一个bitsetbitsetbitset科技。 首先设fi,jf_{i,j}fi,j​表示aaa串匹配到…

牛客题霸 [找到字符串的最长无重复字符子串] C++题解/答案

牛客题霸 [找到字符串的最长无重复字符子串] C题解/答案 题目描述 给定一个数组arr&#xff0c;返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。 题解&#xff1a; i和j两个指针分别指不重复子串的两端&#xff0c;根据情况各自移动&#xff0c;记录最大…

并查集:P1196 [NOI2002] 银河英雄传说

传送门 带权并查集最棒了 dep记录深度&#xff0c;size记录集合大小 转移见代码 #include<cstdio> #include<algorithm> #include<iostream> using namespace std; const int N31000; int n,m; int t; int dep[N],fa[N],size[N]; char s; int a,b; int find…

2021牛客暑期多校训练营4 D-Rebuild Tree(prufer序列+树形dp)

D-Rebuild Tree Prufer 是这样建立的&#xff1a;每次选择一个编号最小的叶结点并删掉它&#xff0c;然后在序列中记录下它连接到的那个结点。重复n−2n-2n−2次后就只剩下两个结点&#xff0c;算法结束。&#xff08;为什么不是n−1n-1n−1次呢&#xff1f;因为第n−1n-1n−1…

牛客题霸 [ 求二叉树的层序遍历] C++题解/答案

牛客题霸 [ 求二叉树的层序遍历] C题解/答案 题目描述 给定一个二叉树&#xff0c;返回该二叉树层序遍历的结果&#xff0c;&#xff08;从左到右&#xff0c;一层一层地遍历&#xff09; 例如&#xff1a; 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3…

T183637-变异距离(2021 CoE III C)【单调栈】

正题 题目链接:https://www.luogu.com.cn/problem/T183637 题目大意 给出nnn个二元组(xi,yi)(x_i,y_i)(xi​,yi​)&#xff0c;求最大的 ∣xi−xj∣min{∣yi∣,∣yj∣}|x_i-x_j|\times min\{|y_i|,|y_j|\}∣xi​−xj​∣min{∣yi​∣,∣yj​∣} 1≤n≤2106,−106≤xi≤106,−…

dfs剪枝:洛谷P2809 hzwer爱折纸

传送门 解析 dfs暴力枚举即可 这题的重点是如何剪枝 不难发现&#xff0c;随着不断处理&#xff0c;纸条只会越来越短&#xff0c;且所有数字总加和不变 我一开始想到了2个条件&#xff1a; 1.当前长度比理想纸条小&#xff0c;return&#xff1b; 2.总加和与理想纸条不等&a…

2021牛客暑期多校训练营2 B-Cannon(组合+推式子)

B-Cannon 首先nnn个炮在一行操作一次的方案数为2(n−2)2(n-2)2(n−2):前面两个炮只能向右吃&#xff0c;最后两个跑只能向左吃&#xff0c;而其余的炮既可以向左也可以向右&#xff0c;于是有42(n−4)42(n-4)42(n−4)种 于是操作mmm次的操作排列的方案数为2m(n−2)(n−3)...(…