与时俱进 | 博客现已运行在 .NET Core 3.0 及 Azure 上

点击上方蓝字关注“汪宇杰博客”

640?wx_fmt=png

导语

9月23日,微软正式发布了 .NET Core 3.0,这个版本具有大量新功能和改进。我也在第一时间将自己的博客网站更新到了 .NET Core 3.0,并且仍然跑在微软智慧云 Azure 国际版的应用服务上。本文总结了我在博客迁移过程中所有的要点。

从 .NET Core 3.0 Preview 8 开始,我一直在研究博客从 .NET Core 2.2 到 .NET Core 3.0的迁移。大多数迁移路径可以遵循微软官方文档。但众所周知,常规ASP.NET 项目绝不会只使用来自微软或 .NET 本身的 API 和包。有很多第三方包可能尚未更新以支持 .NET Core 3.0。某些库仍将在 .NET Core 3.0 上运行,但并不是每个库都可以完全没有任何问题地运行。

典型的 ASP.NET Core 项目的迁移可能卡在这些第三方包上,因此请在迁移之前查看这些包是否有新版本发布。

640?wx_fmt=png

我不会在这里重复微软文档中已有的迁移步骤。请按照正式文档上的所有内容首先将项目迁移到 .NET Core 3.0。但是到目前为止,以下内容并不在文档中,您可能需要注意。

微软官方迁移文档:https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio

运行时及SDK

.NET Core 3.0 运行时可以和旧版本同时安装在一台机器上。例如,你可以同时具有 1.1, 2.1, 2.2 以及 3.0 的运行时,互相不会干扰。

对于 SDK,从3.0开始,安装新版 SDK 会自动卸载旧版本(仅3.0)的SDK,因此你的程序列表里不会出现一大坨SDK。

可以参阅微软官方博客对 SDK 安装改进的说明:https://devblogs.microsoft.com/dotnet/improving-net-core-installation-in-visual-studio-and-on-windows/

要在 Windows Server 的 IIS 上承载一个 .NET Core 3.0 应用,你依然需要安装 Runtime and Hosting Bundle (ANCM 模块)。

Visual Studio 及工具

有许多朋友在微信群里问过,为啥安装了 .NET Core 3.0 SDK,VS里依旧不显示?这是因为只有最新的16.3版的VS2019才完整支持开发.NET Core 3.0程序。因此请确保你先升级到VS2019 16.3。

至于 Visual Studio Code,无需额外的处理,依旧运行得很香。

C# 8 及工程文件

C# 8 与.NET Core 3.0同时发布,当前的SDK及编译器支持最新语法。因此以前我为了让项目在编译服务器上通过而采用的变通方案可以删了:

 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">    <LangVersion>7.3</LangVersion> </PropertyGroup>

被砍的 ASP.NET Core 包

如果你针对 .NET Core 2.x 或者 .NET Standard 2.x 写了个类库,正好用到了像这样的 ASP.NET 包:

<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.5" />

你是肯定找不到他们的3.0版本的,因为大家太喜欢,所以砍了。

详见官方说明:https://github.com/aspnet/AspNetCore/issues/3756

然而仍然有一些漏网之鱼是有3.0版本的,比如这个:

<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="3.0.0" />

因此,如果你找不到对应包的3.0版本,现在的解决方式也很简单,直接将他们替换成一个单独的 Microsoft.AspNetCore.App 的FrameworkRefrence,即可干掉一切ASP.NET Core的包,就算算有3.0版本也可以无视。 

<FrameworkReference Include="Microsoft.AspNetCore.App" />

Json.NET vs System.Text.Json

我个人是个极端微软主义战士,倡导尽可能迁移到 System.Text.Json。事实上,我博客除了引用库依赖以外的用户代码里,已经没有任何 Json.NET 的痕迹了。但是,目前 System.Text.Json 有一些已知的限制和巨坑,比如我在 GitHub 上提出的这个:https://github.com/dotnet/corefx/issues/41102 。诸如此类的问题容易让你的代码瞬间爆炸,而你死活不知道为啥。

不抛出异常的代码也不一定意味着能像以前一样运行。例如,有一些特殊字符会被转义。这会让你的API用户或者前端程序员爆进ICU。

var obj = new { Id = 1, BlowUp = @"Make \things blow / <up>" };

var jsonNetResult = Newtonsoft.Json.JsonConvert.SerializeObject(obj);

var systemTextJsonResult = System.Text.Json.JsonSerializer.Serialize(obj);

这段代码的结果竟然是:

jsonNetResult

{"Id":1,"BlowUp":"Make \\things blow / <up>"}

systemTextJsonResult

{"Id":1,"BlowUp":"Make \\things blow / \u003Cup\u003E"}

因此请格外小心这些转义,一定要在发布到正式环境之前用足够的数据完整测试你的代码。

此外,不仅仅序列化会爆,反序列化也有行为上的差异,容易让你996进ICU。

class BlowUp

{

    public int Id { get; set; }

    public string Name { get; set; }

}

static void Main(string[] args)

{

    string rawJson = "{\"id\":1,\"name\":\"996ICU\"}";

    var obj1 = Newtonsoft.Json.JsonConvert.DeserializeObject<BlowUp>(rawJson);

    var obj2 = System.Text.Json.JsonSerializer.Deserialize<BlowUp>(rawJson);

    Console.WriteLine(obj1.Name);

    Console.WriteLine(obj2.Name);

}

猜猜结果是啥?

640?wx_fmt=png

只有 obj1.Name 有值。因为 obj2 的所有属性都是默认值或null。

这是因为我们传入的JSON字符串用了小写开头的属性名。Json.NET默认会处理这种情况,但是 System.Text.Json 必须使用这样的参数:

var obj2 = System.Text.Json.JsonSerializer.Deserialize<BlowUp>(rawJson, new JsonSerializerOptions

{

    PropertyNameCaseInsensitive = true

});

在真实项目里,ASP.NET Core Web API 或者异教徒的API产品通常返回小写开头的JSON字符串。当我们使用这些API时,System.Text.Json 的默认行为就会让我们爆进ICU。

就像刚才这两个例子一样,新版JSON API有太多意外行为,因此在迁移到 System.Text.Json 前,请确保你有充分的测试数据覆盖所有情况再上线。

Azure 应用程序监控迁移

请参阅我之前的文章:Migrate Azure Application Insights to ASP.NET Core 3.0

https://edi.wang/post/2019/9/2/migrate-azure-application-insights-to-aspnet-core-30

(中文版还没来得及翻译,先凑合看看吧)

Azure DevOps 大爆炸

Azure DevOps 的编译管线里还没有部署 .NET Core 3.0,因此目前你提交一个 .NET Core 3.0 的程序到CI管线里肯定编译不过。解决方案是添加一个安装 .NET Core 3.0 SDK的步骤。

640?wx_fmt=png

Azure App Service 大爆炸

Azure App Service 也还没有部署 .NET Core 3.0。因此如果你直接将项目用默认编译形式部署在Azure上,会直接产生一个ANCM的启动异常,爆进ICU。解决方案是使用SCD部署。

如果你使用的是 Azure DevOps,修改发布参数,添加 SCD 参数,如:--self-contained -r win-x64

640?wx_fmt=png

结束语

以上就是我迁移 .NET Core 3.0 时遇到的所有问题及技巧。还有很多其他我没遇到过的场景,欢迎大家留言补充。

640?wx_fmt=jpeg

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

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

相关文章

Zookeeper:基于Zookeeper的分布式锁与领导选举

本文转发自技术世界&#xff0c;原文链接 http://www.jasongj.com/zookeeper/distributedlock/ 1、Zookeeper特点 1.1 Zookeeper节点类型 如上文《Zookeeper架构及FastLeaderElection机制》所述&#xff0c;Zookeeper 提供了一个类似于 Linux 文件系统的树形结构。该树形结构…

Asp.Net Core Mvc Razor之RazorPage

在AspNetCore.Mvc.Razor命名空间中的RazorPage继承RazorPageBase&#xff0c;并定义的属性为&#xff1a;HttpContext Context 表示当前请求执行的HttpContextRazorPageBase定义为抽象类&#xff0c;并继承了接口&#xff1a;IRazorPageIRazorPage接口定义属性如下&#xff1a;…

Spring Cloud——Consul——架构体系

我们知道&#xff0c;Eureka 2.X因遇到问题&#xff0c;已停止研发。Spring Cloud官方建议迁移到Consul或者Zookeeper等其他服务发现中间件。 下面是 Spring Cloud 支持的服务发现软件以及特性对比&#xff1a; 一、Consul 介绍 Consul 是 HashiCorp 公司推出的开源工具&…

ASP.NET Core 3.0 gRPC 双向流

目录ASP.NET Core 3.0 使用gRPCASP.NET Core 3.0 gRPC 双向流ASP.NET Core 3.0 gRPC 认证授权一.前言在前一文 《二. 什么是 gRPC 流gRPC 有四种服务类型&#xff0c;分别是&#xff1a;简单 RPC&#xff08;Unary RPC&#xff09;、服务端流式 RPC &#xff08;Server streami…

开源公司被云厂商“寄生”,咋整?

上周 OSS Capital 召集一些开源公司&#xff0c;组织了一场关于如何面对“云厂商给开源带来的危害”的会议。OSS Capital 是一家风险投资公司&#xff0c;该公司只投开源&#xff0c;其董事会合伙人之一是开源运动的先驱人物 Bruce Perens。网上有一个十分有名的“开源商业化独…

Spring Cloud Config——原理解析

springCloud config项目,用来为分布式的微服务系统中提供集成式外部配置支持,分为客户端和服务端 可以让你把配置放到远程服务器&#xff0c;目前支持本地存储、Git以及Subversion。 spring官方如下介绍: 简而言之: 通过配置服务(Config Server)来为所有的环境和应用提供外部配…

AWS加入.NET Foundation企业赞助商计划

.NET 走向开源&#xff0c;MIT许可协议。 微软为了推动.NET开源社区的发展&#xff0c;2014年联合社区成立了.NET基金会。.NET基金会是一个独立的组织&#xff0c;支持.NET社区和开源&#xff0c;旨在拓宽和加强.NET生态系统和社区。这可以通过多种方式完成&#xff0c;包括项目…

Spring cloud——Hystrix 原理解析

1、背景 分布式系统环境下&#xff0c;服务间类似依赖非常常见&#xff0c;一个业务调用通常依赖多个基础服务。如下图&#xff0c;对于同步调用&#xff0c;当库存服务不可用时&#xff0c;商品服务请求线程被阻塞&#xff0c;当有大批量请求调用库存服务时&#xff0c;最终可…

【B】替换 Quartz.net 默认使用的 MySql.Data 为 Mysqlconnector 的学习过程

文章转载授权级别&#xff1a;B无论是 Quartz.net 还是 MySql.Data 都是我们比较熟悉的库了&#xff0c;Quartz.net 如果配置为使用 MySql 数据库做持久化时&#xff0c;默认是硬编码了使用 MySql.Data 来操作 MySql 数据库的。下面是我的一些个人诉求和实践&#xff0c;和大家…

APM(应用性能管理)与Dapper原理介绍

一、APM&#xff08;应用性能管理&#xff09; 1.1 什么是APM&#xff1f; APM (Application Performance Management) 即应用性能管理&#xff08;应用性能监控&#xff09; APM主要是针对企业 关键业务的IT应用性能和用户体验的监测、优化&#xff0c;提高企业IT应用的可靠…

asp.netcore3.0 使用 DbProviderFactories 连接数据库

在.netstandard2.0时 System.Data.Common 这个包里并没有加入DbProviderFactoriesDbProviderFactories类在.netframework中是非常重要的存在,依靠他可以适配各种数据库客户端&#xff08;sqlserver、mysql、sqllite等&#xff09;创建数据库连接。现在可以像.netframework中一样…

MIT 6.824 Lab 1 MapReduce

MapReduce 目标 根据论文所说明的&#xff0c;有MASTER和WORKER两类工作节点&#xff0c;以下实现大都按照论文所说的实现&#xff0c;但是在对MASTER的实现上有所改动&#xff1a; MASTER向WORKER发送心跳检测&#xff0c;这里改为了对分配出去的任务进行超时监控。 MASTER…

大家在寻找的高级程序员到底是什么样子的?

你好&#xff0c;我是Z哥。这篇文章主题很简单&#xff0c;就是一个很常见的话题“什么是高级程序员&#xff1f;”。文章稍微长了些&#xff0c;但是很容易阅读。我们的中国文化&#xff0c;对“面子”看的特别重&#xff0c;所以你会发现身边到处都是高级XXX&#xff0c;听着…

优秀的程序员是那种过单行线马路都要往两边看的人

最近一周帮我以前一个同事推荐工作&#xff0c;顺便了解下行情&#xff0c;我这个同事我感觉还行&#xff0c;技术不说有多好&#xff0c;但是往年绝对不至于简历筛选时被刷掉那种&#xff0c;最先开始推给了一个我比较信任的HR手里&#xff0c;她兼职猎头&#xff0c;推给这个…

【为自己相亲】单身小姐姐你在哪里,我是书豪,我在等你

笔者简介Introduction书豪&#xff1a;【人工智能爱好者社区】公众号负责人《R数据科学实战&#xff1a;工具详解与案例分析》书籍作者。 你没看错这是书豪在给自己寻觅良缘如果你有&#xff0c;或者身边的朋友有兴趣请与我联系基本信息 出生日期&#xff1a;1995年5月身高&am…

知道的越多,越感觉自己渺小

作者&#xff1a;猛哥&#xff0c;关注技术和人文发展的程序员&#xff0c;架构师社区合伙人芝诺说&#xff1a;“人的知识就像一个圆&#xff0c;圆圈外是未知的&#xff0c;圆圈内是已知的&#xff0c;你知道的越多&#xff0c;你的圆圈就会越大。圆的周长也就越大&#xff0…

.NET Core 3.0 System.Text.Json 和 Newtonsoft.Json 行为不一致问题及解决办法

行为不一致.NET Core 3.0 新出了个内置的 JSON 库, 全名叫做尼古拉斯 System.Text.Json - 性能更高占用内存更少这都不是事...对我来说, 很多或大或小的项目能少个第三方依赖项, 还能规避多个依赖项的依赖 Newtonsoft.Json 版本不一致的问题, 是件极美的事情.但是, 结果总不是不…

Java9 新特性

在介绍 java9 之前&#xff0c;我们先来看看java成立到现在的所有版本。 1990年初&#xff0c;最初被命名为Oak&#xff1b;1995年5月23日&#xff0c;Java语言诞生&#xff1b;1996年1月&#xff0c;第一个JDK-JDK1.0诞生&#xff1b;1996年4月&#xff0c;10个最主要的操作系…

深入探究Kubernetes - 初识容器

♥2019年8月28星期三第47篇原创引言最近Kubernetes比较火&#xff0c;新技术快速火起来&#xff0c;一定有它强大的优势&#xff0c;Hr反馈&#xff0c;招聘时会Kubernetes的很少&#xff0c;风口上的Kubernetes一起学学&#xff1f;扫盲贴&#xff0c;参考《Kubernetes进阶实践…

Java11 新特性

Java 11新特性的详细解释。JDK 11已经于 2018年9月25日正式发布&#xff0c;那么Java 11主要包含哪些新特性呢&#xff1f; JDK 11是Java SE 11平台版本11的开源参考实现&#xff0c;由JSR 384在Java Community Process中指定。 阿里巴巴是中国唯一的JCP委员会成员公司&#x…