从ASP.NET Core2.2到3.0你可能会遇到这些问题
趁着假期的时间所以想重新学习下微软的官方文档来巩固下基础知识。我们都知道微软目前已经发布了.NET Core3.0的第三个预览版,同时我家里的电脑也安装了vs2019。So,就用vs2019+.NET Core3.0来跟着做一下Contoso University这个WEB应用,但是在基于3.0进行操作的时候遇到了一些问题,所以我就查看了微软的《从 ASP.NET Core 迁移 2.2 到 3.0 预览版 2》这篇文档,就着今天遇到的问题,所以我整理下,希望对大伙有所帮助,当然大伙也可以直接阅读微软的官方文档进行查看。但是我在阅读官方说明的时候,总感觉翻译的不是很准确,读起来很拗口,所以这里我是自己的理解对官方文档的一个补充。
作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10661161.html
我遇到的问题
ASP.NET Core2.0时代,若要为项目添加 EF Core 支持,需要安装相应的数据库驱动包。 教程中使用 SQL Server,相关驱动包Microsoft.EntityFrameworkCore.SqlServer。 此包包含在 Microsoft.AspNetCore.App 元包中,因此,如果应用具有对 Microsoft.AspNetCore.App
包的包引用,则无需引用该包。而2.0中的模板项目会自动为我们加载Mcrosoft.AspNetCore.App
这个包的。但是3.0中没有了这个Mcrosoft.AspNetCore.App
这个包,模块化的更彻底了!所需要的EF相关的包需要你自己来进行引用。
2.0升3.0升级指南
就着今天遇到的问题,所以我整理下ASP.NET Core从2.0升级3.0的一个升级指南,希望对大伙有所帮助,当然大伙也可以直接阅读微软的官方文档进行查看。但是我在阅读官方说明的时候,总感觉翻译的不是很准确,读起来很拗口,所以这里我是自己的理解对官方文档的一个补充。
更新项目文件
- 设置TargetFramework到
netcoreapp3.0
: <TargetFramework>netcoreapp3.0</TargetFramework> - 删除Microsoft.AspNetCore.All或Microsoft.AspNetCore.App元包的任何
<PackageReference>
。 - 将
<PackageReference>
元素中剩余的Microsoft.AspNetCore.*
程序包更新到当前的预览版中 (例如,3.0.0-preview3.19128.7)。 如果没有对应的 3.0 版本的包,则说明包可能会在 3.0 中弃用。 其中许多之前都属于Microsoft.AspNetCore.App
并且不需要单独引用的包,如上面我遇到的问题,关于SQL Server的EF相关的包。 具体的不再在 3.0 中生成的包的列表,请参阅aspnet/AspNetCore #3756。 - 某些程序集已从2.x和3.0之间的Microsoft.aspnetcore.app中删除。如果您正在使用aspnet/AspNetCore #3755中列出的包中的API,则可能需要单独添加到。
例如,
Microsoft.EntityFrameworkCore
和System.Data.SqlClient
不再属于Microsoft.AspNetCore.App
得一部分。 Microsoft.aspnetcore.app中的程序集列表尚未定稿,将在3.0 RTM之前更改。 - 添加Json.NET 支持。
- 项目默认为 ASP.NET Core 3.0 或更高版本设置为进程内承载模型。 当然,如果其值为
InProcess
您还可以通过删除<AspNetCoreHostingModel>
元素,来进行修改。
Json.NET 支持
作为提高 ASP.NET Core 共享的框架工作的一部分, Json.NET已从 ASP.NET Core 共享框架中删除。
若要在 ASP.NET Core 3.0 项目中使用 Json.NET:
- 添加到包引用Microsoft.AspNetCore.Mvc.NewtonsoftJson
- 更新
ConfigureServices
调用AddNewtonsoftJson()
。 services.AddMvc() .AddNewtonsoftJson();
Newtonsoft 的个性化设置可以设置为AddNewtonsoftJson
:
services.AddMvc()
.AddNewtonsoftJson(options =>
options.SerializerSettings.ContractResolver =
new CamelCasePropertyNamesContractResolver());
HostBuilder 替换 WebHostBuilder
使用 ASP.NET Core 3.0 模板泛型宿主。 早期版本使用Web 主机。 下面的代码显示了生成 ASP.NET Core 3.0 模板Program
类:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
下面的代码演示模板生成 ASP.NET Core 2.2Program
类:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
IWebHostBuilder 将保留在 3.0,是一种webBuilder
上面的代码示例所示。 WebHostBuilder 将在未来版本中弃用并替换为HostBuilder
。
从WebHostBuilder
到HostBuilder
最显著的变化是依赖关系注入 (DI)。 使用时HostBuilder
,只能将IConfiguration并IHostingEnvironment注入到Startup
的构造函数中。 HostBuilder
DI 约束:
- 使DI容器只能构建一次。
- 避免产生的对象生存期问题,例如解决多个单例实例。
更新 SignalR 代码
如果您调用AddJsonProtocol
,将其替换为AddNewtonsoftJsonProtocol
。
- 以下示例显示更改前后的服务器代码: services.AddSignalR(...) .AddJsonProtocol(...) // 2.2 services.AddSignalR(...) .AddNewtonsoftJsonProtocol(...) // 3.0
- 以下示例显示更改前后的.NET客户端代码: connection = new HubConnectionBuilder() .WithUrl(...) .AddJsonProtocol(...) // 2.2 .Build() connection = new HubConnectionBuilder() .WithUrl(...) .AddNewtonsoftJsonProtocol(...) // 3.0 .Build()
选择启用运行时编译
在 3.0 中,运行时编译是可选的方案。 若要启用运行时编译,请参阅ASP.NET Core 中的 Razor 文件编译。
总结
感觉微软在努力实现ASP.NET Core的模块化,减小各种依赖,让包变得更小。同时ASP.NET Core也已经很完善了,大伙是时候用起来ASP.NET Core了。另外需要说明的一点是,大伙如果是为了体验ASP.NET Core3.0的话,现在就可以,如果是用在生产环境的话最好还是等待正式版的发布吧。
- 剑指 offer代码解析——面试题38数字在排序数组中出现的次数
- 剑指 offer代码解析——面试题37两个链表的第一个公共结点
- 剑指 offer代码解析——面试题34丑数
- 剑指 offer代码解析——面试题35第一个只出现一次的字符
- Python内置数据结构之集合
- 剑指 offer代码解析——面试题32统计1到n中1出现的次数
- 剑指 offer代码解析——面试题26复杂链表的复制
- Linux软件安装(二)——RPM与YUM
- linux软件安装(一)——源码安装
- 利用LUA协程实现FUTURE模式
- Python内置数据结构之字典(完整版)
- Maven使用详解
- LUA debug 工具函数
- Python之Windows环境搭建
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [源码解析]Oozie来龙去脉之内部执行
- [记录点滴]编译安装luarocks、luacheck、luautf8
- [笔记整理] 一维搜索
- [记录点滴] 使用工具和命令对redis数据进行备份恢复
- [记录点滴]Spring Boot Admin源码分析笔记
- [记录点滴] luaxml编译过程
- [源码解析] Flink UDAF 背后做了什么
- [源码解析] 当 Java Stream 遇见 Flink
- [源码解析] Flink的Slot究竟是什么?(1)
- [源码解析] Flink的Slot究竟是什么?(2)
- [记录点滴] Spark迁移到Flink的几个点
- 深度对比Python的3种“字符串格式化”方法,看看你喜欢哪一种?
- 用Python分析广州房地产市场
- 面试题-JAVA之HashMap-put方法源码分析
- 案例实战 | Python 玩转 AB 测试中的分层抽样与假设检验!(附代码和数据集)