asp.net core 3.0 更新简记

asp.net core 3.0 更新简记

Intro

最近把活动室预约项目从 asp.net core 2.2 更新到了 asp.net core 3.0,记录一下,升级踩过的坑以及经验总结,包括但不限于

  • TargetFramework ( netcoreapp2.2 需要更新为 netcoreapp3.0)

  • Dependency

  • Host/Environment

  • Mvc

  • Routing

  • Swagger

  • Dockerfile

  • EF(不推荐更新)

TargetFramework 更新

原来项目里的 netcoreapp2.x 版本需要更新为 netcoreapp3.0,原来有些基于 netstandard2.0 的项目的包如果有包更新之后依赖 netstandard2.1 可能需要更新为 netstandard2.1(非必须,看项目依赖)

Dependency

原来在 dotnetcore 2.x 版本时大部分的包以 nuget 的形式提供,可以直接通过 nuget 引用,从 dotnetcore 3.0 开始很多包不再发布 nuget 包,需要通过框架引用来引用包( FrameworkReference)

比如在一个类库项目 <ProjectSdk="Microsoft.NET.Sdk"> 里有这么一个引用 <PackageReferenceInclude="Microsoft.AspNetCore.Mvc.Core"Version="2.2.2"/>,在 dotnetcore 3.0 并没有发布对应的 nuget 包,需要使用框架引用,示例如下:

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

如果是 Web 项目 <ProjectSdk="Microsoft.NET.Sdk.Web">,Sdk 是 Web 的话直接把 targetFramework 更新的 netcoreapp3.0 就可以了,不需要再添加上面的引用了,项目里 <PackageReferenceInclude="Microsoft.AspNetCore.App"/> 的引用也可以直接移除了

Host && Environment

原来的 IHostingEnvironment 改为了 IWebHostEnvironment,原来注入 IHostingEnvironment 的地方需要修改为注入 IWebHostEnvironment

原来 Program 里使用的 WebHostBuilder 改为 HostBuilder 并配置 `ConfigureWebHostDefaults `,变更如下:

640?wx_fmt=png

MVC

服务注册

3.0 里 MVC 对 ControllerRazorPages 以及 RazorViews 整理,注入服务的时候我们可以只注入自己需要的服务,如果是 WebAPI 项目可以只添加 Controller 需要的服务即可,对应的添加方式:

services.AddControllers(); // WebAPI	
services.AddControllersWithViews(); // MVC	
services.AddRazorPages(); // RazorPage

JSON 配置

asp.net core 3.0 默认使用微软新的 JSON,但是推荐还是用 Newtonsoft.Json,比较成熟而且对很多比较特殊的情况都有处理,已然成为了.NET 里 JSON 序列化的事实标准,使用方式如下:

  1. 引用 nuget 包 Microsoft.AspNetCore.Mvc.NewtonsoftJson

  2. 配置使用 Newtonsoft.Json

services.AddControllersWithViews()	.AddNewtonsoftJson(options =>	{	options.SerializerSettings.ContractResolver = new DefaultContractResolver();	options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; // 设置时区为 UTC	});

Rounting

asp.net core 3.0 推荐使用 endpoint rounting

配置方式如下:

           app.UseStaticFiles();	app.UseSwagger()	.UseSwaggerUI(c =>	{	// c.RoutePrefix = string.Empty; //	c.SwaggerEndpoint($"/swagger/{ApplicationHelper.ApplicationName}/swagger.json", "活动室预约系统 API");	c.DocumentTitle = "活动室预约系统 API";	});	app.UseRouting(); // 放在 UseStaticFiles 之后	app.UseCors(builder => builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin());	app.UseRequestLog();	app.UsePerformanceLog();	app.UseAuthentication();	app.UseAuthorization(); // 放在 UseAuthentication 之后	app.UseEndpoints(endpoints =>	{	endpoints.MapControllers(); // 属性路由	endpoints.MapControllerRoute("Notice", "/Notice/{path}.html", new	{	controller = "Home",	action = "NoticeDetails"	}); // 自定义路由	endpoints.MapControllerRoute(name: "areaRoute", "{area:exists}/{controller=Home}/{action=Index}"); // 区域路由	endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}"); // 默认路由	});

Swagger

更新 swagger 依赖到最新的 5.0.0-rc-x 版本(还没发稳定版,需要显示预览版本才能看到)

services.AddSwaggerGen(options =>	
{	options.SwaggerDoc(ApplicationHelper.ApplicationName, new Microsoft.OpenApi.Models.OpenApiInfo { Title = "活动室预约系统 API", Version = "1.0" });	options.IncludeXmlComments(System.IO.Path.Combine(AppContext.BaseDirectory, $"{typeof(Models.Notice).Assembly.GetName().Name}.xml"));	options.IncludeXmlComments(System.IO.Path.Combine(AppContext.BaseDirectory, $"{typeof(API.NoticeController).Assembly.GetName().Name}.xml"), true);	
});

这里没有用到 OperationFilter,如果用到了 OperationFilter,可能需要引入 Swashbuckle.AspNetCore.Filters 这个包,详细参考:https://www.cnblogs.com/laozhang-is-phi/p/11520048.html#autoid-6-0-0

Docker

Dockerfile 里基础镜像需要更新到 3.0

示例 dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-alpine AS build-env	
WORKDIR /src	
# Copy csproj and restore as distinct layers	
COPY ActivityReservation.Common/*.csproj ActivityReservation.Common/	
COPY ActivityReservation.Models/*.csproj ActivityReservation.Models/	
COPY ActivityReservation.DataAccess/*.csproj ActivityReservation.DataAccess/	
COPY ActivityReservation.Business/*.csproj ActivityReservation.Business/	
COPY ActivityReservation.Helper/*.csproj ActivityReservation.Helper/	
COPY ActivityReservation.WechatAPI/*.csproj ActivityReservation.WechatAPI/	
COPY ActivityReservation.AdminLogic/*.csproj ActivityReservation.AdminLogic/	
COPY ActivityReservation.API/*.csproj ActivityReservation.API/	
COPY ActivityReservation/ActivityReservation.csproj ActivityReservation/	
# RUN dotnet restore ActivityReservation/ActivityReservation.csproj	
## diff between netcore2.2 and netcore3.0	
WORKDIR /src/ActivityReservation	
RUN dotnet restore	
# copy everything and build	
COPY . .	
RUN dotnet publish -c Release -o out ActivityReservation/ActivityReservation.csproj	
# build runtime image	
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-alpine	
LABEL Maintainer="WeihanLi"	
WORKDIR /app	
COPY --from=build-env /src/ActivityReservation/out .	
EXPOSE 80	
ENTRYPOINT ["dotnet", "ActivityReservation.dll"]

修改基础镜像一般不会有什么问题,需要注意的是如果 dockerfile 里有用到 dotnet publish 且publish 的项目不在当前目录下,可能会遇到这样的问题,最后找不到要发布的文件。

dotnet core 3.0 cli 有个 breaking change,如果要发布的项目不在当前目录下,在 2.x 版本是会发布到项目文件所在目录下的,但是 3.0 版本会发布在当前目录下,比如说执行 dotnet publish-cRelease./src/ActivityReservation.csproj-oout命令:

2.x版本会在 src目录下生成一个 out 文件夹

3.0 版本会在当前目录下生成一个 out 文件夹, out文件夹和 src 同级

详细问题可以参考 https://github.com/dotnet/cli/issues/12696

EF

EF Core 3.0 和 asp.net core 3.0 完全独立,可以在 asp.net core 3.0 的项目里使用 2.x 的 EF Core

EF Core 3.0 有个 breaking change,不再隐式支持客户端渲染数据,这可以让你更清晰的知道哪些条件和在数据库执行的哪些条件是在本地执行的,但是实际试用下来,还是有很多问题的,在 EF 的基础上封装了一层,使用表达式树来拼接查询条件,但是最后执行的时候会有问题,但是简化后的条件实际上并不会在客户端执行任何过滤操作,所以暂时不推荐试用 ef core 3.0,而且更新之后可能会遇到其他的问题,详见issue https://github.com/aspnet/EntityFrameworkCore/issues/18025

现在的项目使用 ef core2.1 + asp.net core3.0 运行

More

其他的地方应该也有需要修改的地方,欢迎补充

Reference

  • https://www.cnblogs.com/stulzq/p/11497624.html

  • https://www.cnblogs.com/laozhang-is-phi/p/11520048.html

  • https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio

  • https://github.com/WeihanLi/ActivityReservation/pull/28/files

640?wx_fmt=jpeg

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

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

相关文章

kafka吞吐量高的原因

kafa 吞吐量高的原因 1、顺序读写 kafka的消息是不断追加到文件中的&#xff0c;这个特性使kafka可以充分利用磁盘的顺序读写性能 顺序读写不需要硬盘磁头的寻道时间&#xff0c;只需很少的扇区旋转时间&#xff0c;所以速度远快于随机读写 2、零拷贝 在Linux kernel2.2 之…

【 .NET Core 3.0 】框架之三 || swagger的使用

一、为什么使用Swagger上文中已经说到&#xff0c;单纯的项目接口在前后端开发人员使用是特别不舒服的&#xff0c;那所有要推荐一个&#xff0c;既方便又美观的接口文档说明框架&#xff0c;当当当&#xff0c;就是Swagger&#xff0c;随着互联网技术的发展&#xff0c;现在的…

MQ问题集(kafka主从同步与高可用,MQ重复消费、幂等)

1、kafka主从同步与高可用 https://1028826685.iteye.com/blog/2354570 http://developer.51cto.com/art/201808/581538.htm 2、MQ有可能发生重复消费&#xff0c;如何避免&#xff0c;如何做到幂等 2.1 MQ消息发送 1、发送端MQ-client(消息生产者&#xff1a;Producer)将消…

微软编程题:寻找最小的k个值

转载自&#xff1a;http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数 题目描述&#xff1a;5.查找最小的k个元素 题目&#xff1a;输入n个整数&#xff0c;输出其中最小的k个。 例如输入1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xf…

Bumblebee微服务网关之访问日志处理

记录访问日志可以起到非常重要的作用&#xff0c;它不仅记录了API的使用情况&#xff0c;更可以反映API各种相关数据&#xff1b;通过分析日志可以得到API不同时间的负载情况&#xff0c;访问效率和流量分布&#xff0c;更进一步还能分析出用户的操作历史和行为这是非常有价值的…

负载均衡基础

1、什么是负载均衡&#xff08;Load balancing&#xff09; 在网站创立初期&#xff0c;我们一般都使用单台机器对台提供集中式服务&#xff0c;但是随着业务量越来越大&#xff0c;无论是性能上还是稳定性上都有了更大的挑战。这时候我们就会想到通过扩容的方式来提供更好的服…

Bumblebee微服务网关之并发限制

对于服务应用来说支持的并发越高越好&#xff0c;但很多时候资源有限&#xff0c;超负载的并发则会给整体应用带来更大的危险性&#xff08;更何况有些并发来源是恶意的&#xff09;。作为微服务网关应该具有一定的挡洪作用&#xff0c;这样可以一定程度保障后台逻辑服务的稳定…

[ASP.NET Core 3框架揭秘] 跨平台开发体验: Mac OS

除了微软自家的Windows平台&#xff0c; .NET Core针对Mac OS以及各种Linux Distribution&#xff08;RHEL、Ubuntu、Debian、Fedora、CentOS和SUSE等&#xff09;都提供了很好的支持。我们先来体验一下使用Mac来开发.NET Core应用&#xff0c;在这之前我们照例先得在Mac OS上构…

接雨水

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#xff0c;在这种情况下&#xff0c;可以接 6 个单位的雨水&#xff08;蓝色部分表示…

使用RabbitMQ实现接口补偿

业务背景在我们的日常开发中&#xff0c;经常需要调用第三方接口来进行数据传递&#xff0c;在调用接口的过程中&#xff0c;会因为各种原因导致调用的失败。这时我们希望能有一种机制实现对失败的接口的重复调用&#xff0c;并且能够实现人工干预。实现思路1、当接口调用失败&…

集群环境下,你不得不注意的ASP.NET Core Data Protection 机制

引言最近线上环境遇到一个问题&#xff0c;就是ASP.NET Core Web应用在单个容器使用正常&#xff0c;扩展多个容器无法访问的问题。查看容器日志&#xff0c;发现以下异常&#xff1a;System.Security.Cryptography.CryptographicException: The key {efbb9f35-3a49-4f7f-af19-…

.NET斗鱼直播弹幕客户端(上)

前言现在直播平台由于弹幕的存在&#xff0c;主播与观众可以更轻松地进行互动&#xff0c;非常受年轻群众的欢迎。斗鱼TV就是一款非常流行的直播平台&#xff0c;弹幕更是非常火爆。看到有不少主播接入 弹幕语音播报器、 弹幕点歌等模块&#xff0c;这都需要首先连接斗鱼弹幕。…

程序员后期,架构师发展路线!

作者:zollty&#xff0c;资深程序员和架构师&#xff0c;私底下是个爱折腾的技术极客&#xff0c;架构师社区合伙人&#xff01;我总结了3个阶段。先说一下各个阶段的感受&#xff1a;1、系统架构阶段&#xff1a;系统架构实际上包括了 业务功能架构 和 技术功能架构。业务上&a…

YUV格式学习

转载自http://blog.csdn.net/searchsun/article/details/2443867 YUV是指亮度参量和色度参量分开表示的像素格式&#xff0c;而这样分开的好处就是不但可以避免相互干扰&#xff0c;还可以降低色度的采样率而不会对图像质量影响太大。YUV是一个比较笼统地说法&#xff0c;针对它…

Flappy Bird游戏python完整源码

通过pygame实现当年风靡一时的flappy bird小游戏。 当前只设定了同样长度的管道&#xff0c;图片和声音文件自行导入。 效果如下&#xff1a; # -*- coding:utf-8 -*- """ 通过pygame实现曾风靡一时的flappybird游戏。 小鸟x坐标不变&#xff0c;画布左移实现…

【 .NET Core 3.0 】框架之九 || 依赖注入 与 IoC

本文有配套视频&#xff1a;https://www.bilibili.com/video/av58096866/?p5前言1、重要&#xff1a;如果你实现了解耦&#xff0c;也就是 api 层只引用了 IService 和 IRepository 的话&#xff0c;那每次修改 service 层&#xff0c;都需要清理解决方案&#xff0c;重新编译…

10月数据库排行:Microsoft SQL Server分数增加最多

DB-Engines 数据库流行度排行榜 10 月更新已发布&#xff0c;排名前二十如下&#xff1a;这期的数据比较有意思&#xff0c;到了这个月&#xff0c;Microsoft SQL Server 马上扭转局势&#xff0c;成了分数增长最多的一个&#xff0c;与上个月相比其增加了 9.66 分&#xff0c;…

VS Code 1.39 发布!Web 版 VS Code 是否离我们越来越近了?(文末彩蛋)

今天&#xff08;北京时间 2019 年 10 月 10 日&#xff09;&#xff0c;微软发布了 Visual Studio Code 1.39 版本。此版本主要更新的内容包括&#xff1a;Source Control tree view - 可以通过列表或者树状图两种方式来展示被改变的文件。Toggle region folding keyboard sho…

二叉树分析(两点最大距离)

转载自&#xff1a;http://blog.csdn.net/lalor/article/details/7626678 http://blog.csdn.net/lalor/article/details/7618120 把二叉树看成一个图&#xff0c;父子节点之间的连线看成是双向的&#xff0c;我们姑且定义"距离"为两节点之间边的个数。写…

IT从业的迷思与破解之道(更新)

我只是单纯做技术的程序员&#xff0c;什么靠微信广告攒钱这些&#xff0c;跟我没有半毛钱关系&#xff0c;初衷很简单&#xff0c;只重视正三观的正确技术知识分享在这到处都是线上培训&#xff0c;付费知识的社群里&#xff0c;随便搜个词都有您想要的内容哪轮到我们。技术的…