与时俱进 | 博客现已运行在 .NET Core 3.0 及 Azure 上
点击上方蓝字关注“汪宇杰博客”
导语
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 项目的迁移可能卡在这些第三方包上,因此请在迁移之前查看这些包是否有新版本发布。
我不会在这里重复微软文档中已有的迁移步骤。请按照正式文档上的所有内容首先将项目迁移到 .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);
}
猜猜结果是啥?
只有 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的步骤。
Azure App Service 大爆炸
Azure App Service 也还没有部署 .NET Core 3.0。因此如果你直接将项目用默认编译形式部署在Azure上,会直接产生一个ANCM的启动异常,爆进ICU。解决方案是使用SCD部署。
如果你使用的是 Azure DevOps,修改发布参数,添加 SCD 参数,如:--self-contained -r win-x64
结束语
以上就是我迁移 .NET Core 3.0 时遇到的所有问题及技巧。还有很多其他我没遇到过的场景,欢迎大家留言补充。
与时俱进 | 博客现已运行在 .NET Core 3.0 及 Azure 上相关推荐
- hexo博客本地服务器显示正常,Hexo 搭建博客 本地运行 常见报错及解决办法
作为一名在hexo方面的新手,我在使用hexo编辑文档时遇到了很多问题,hexo generate编译的时候遇到了各种错误. 在此将这些错误及其解决方案记录下来,以便日后查证之用,同时,也可给各位在遇 ...
- 个人博客的运营模式能否学习TMALL天猫质量为上?
心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在那个时候写出来的 ...
- Ubuntu 安装 CLI 并运行 ASP.NET Core 1.0
Ubuntu 下载地址:http://www.ubuntu.org.cn/download/desktop 注:目前 CLI 的安装命令只支持 Ubuntu 14.04,暂不支持 Ubuntu 14. ...
- 博客主题源码Yusi版本1.0,简洁明了的WordPress
介绍 无需任何插件,极度优化,支持在线支付,全设备响应式简洁明了的WordPress博客主题Yusi1.0 下载链接 http://www.bytepan.com/Ecq7mFapcrl 图片
- 个人博客网站html源码_最新0成本简单使用CODING Pages搭建Gridea个人博客网站详细教程...
直接0成本简单使用CODING Pages免费搭建Gridea个人博客网站,不需要购买域名也不需要购买服务器就可以搭建自己的博客 教程开始 gridea官网 gridea.devcoding 官网 e ...
- php个人博客响应式源码下载,Thinkphp5.0大气响应式青春博客个人博客源码
Thinkphp5.0大气响应式青春博客个人博客源码 青春博客功能模块 1.删减说说和相册 主要功能减少不需要的功能,之前的功能都是参考别人的功能去使用,在博客使用的2年期间,发现说说和相册的功能基本 ...
- JS放在博客里面运行
<ol><li>测试的内容</li><li>测试的内容</li><li>测试的内容</li><li>测试 ...
- 博客页面运行代码demo测试
demo <!doctype html> <title>demo测试</title> <meta charset="utf-8"/> ...
- 【Mo 人工智能技术博客】图卷积网络概述及其在论文分类上的应用
近年来,深度学习在计算机视觉.自然语言处理等领域大放异彩.这些领域所面对的数据都是结构化的,如图像.音频.文本等,它们内部都有明确的排列规则.结构化的数据由于具有这些确定的规则而方便处理,但是在现实生 ...
最新文章
- c的按位取反运算符(~) 与逻辑逻辑(!)
- linux中配置DHCP基本操作
- 【Groovy】自定义 Xml 生成器 BuilderSupport ( nodeCompleted 方法获取节点闭合信息 )
- 第十二天Python学习记录
- 自由自在公司进口食品呈现高端消费的趋势
- 【php】用filter_var实现的简单参数验证
- js(Dom+Bom)第二天(1)
- Springboot(十):邮件服务
- jpa mysql存储过程_spring data jpa 如何调用mysql存储过程?
- 敏捷落地的会议和工具
- SpringBoot解决驼峰命名 ---返回Json实体类属性大小写问题
- IDEA中 GIT与SVN版本控制插件的切换
- SQL Server 2008安装图解教程
- LINUX实验---网络管理
- Linux网络编程-UDP单播服务客户端代码实现
- 工作 7 年的老程序员,现在怎么样了
- 复杂电路简化经典例题_复杂电路简化练习题
- IEEE论文投稿模板及分类简介
- CISP-PTE学习总结之基础练习题(四)
- 计算机网络部分复习题
热门文章
- jQuery Pagination Ajax分页插件中文详解
- What's blocking my lock? 转载
- 自定义注解在拦截器中为空_如何在Android中为特定联系人设置自定义铃声
- 【本人秃顶程序员】技巧分享丨spring的RestTemplate的妙用,你知道吗?
- 【Flutter教程】从零构建电商应用(一)
- Lombok@Builder和@NoArgsConstructor冲突
- 转:java的各个拓展类库的推荐方案
- thinkphp 3.2 unionall
- C#语法糖 Null 条件运算符 【?.】
- Xamarin效果第十五篇之自定义CheckBox