asp 取数据 计算_将 ASP.NET Core 2.1 升级到最新的长期支持版本ASP.NET Core 3.1

本文详细介绍了如何将ASP.NET Core 2.1项目升级到3.1版本,包括项目文件、Program.cs和Startup.cs的修改。在升级过程中,遇到了Microsoft.AspNetCore.Mvc.ViewFeatures.Internal的移除,导致ViewBag相关问题。通过调整代码,实现了向后兼容。此外,文章还强调了.NET Core 3.1的性能提升。
摘要由CSDN通过智能技术生成

24e0aae672e6f5bef0cdc8372ab27d06.png

 前言

2019年的最后一个月,微软终于发布了.Net Core 3.1,这是 .Net Core 有史以来的第二个长期支持版本(至少 3 年的支持期限)。

作为一个大版本更新,.NET Core 3.0 引入了大量改进和新特性,例如新增加的 Windows Forms 和 WPF、新的 JSON API、对 ARM64 架构的支持,以及全面提升的性能。

所以升级是势在必行的,那么很多开发人员就面临一个问题:

如果从上一个长期支持版本 ASP.NET Core 2.1 升级到最新的 ASP.NET Core 3.1 ?

 .Net Core 版本列表:

35a2146a01e5d8276ee4c2055cf1fb9b.png

如果是之前的 .Net Framework,这个升级是非常平滑的,甚至不需要做任何改动(比如:.Net Framework 2.0 -> .Net Framework 4.5),但是 .Net Core 的升级却有点麻烦,微软给出了一系列的升级指南,不过都是从上一个版本到下一个紧邻版本:

ASP.NET Core 2.1 -> 2.2:https://docs.microsoft.com/zh-cn/aspnet/core/migration/21-to-22

ASP.NET Core 2.2 -> 3.0:https://docs.microsoft.com/zh-cn/aspnet/core/migration/22-to-30

ASP.NET Core 3.0 -> 3.1:https://docs.microsoft.com/zh-cn/aspnet/core/migration/30-to-31

当然这个过程不仅仅是改个配置文件的问题,.Net Core 的版本升级中居然有很多 Breaking changes,也就是说如果你用的类在 .Net Core 3.1 中突然删除了,对不起,你只有调整自己代码的份了。 

Microsoft.AspNetCore.Mvc.ViewFeatures.Internal 消失了

而且这个 Breaking changes 还不少,比如 FineUICore 之前的版本(支持ASP.NET Core 2.1)用到的 Microsoft.AspNetCore.Mvc.ViewFeatures.Internal 在 .Net Core 3.1 就被无情的删掉了:

f7d3c1adf73290044f1f90bc10e72afa.png

那位说了,你为啥要用 .Internal 里面的类?

这是很正常的,FineUICore作为一个支持 ASP.NET Core 的控件库,需要一些底层操作,为了支持快速数据绑定,类似如下的形式:

  • 支持 TagHelpers 的页面代码:

  • 支持 HtmlHelpers 的视图代码:F.DatePickerFor(m => m.TheModel.StartDate)

933d68efc133d21d76ccc762b092ca5d.png

为了支持这个特性,我们就需要计算表达式的文本值,以及表达式所绑定的数据,因此就用到了如下两个静态类方法:

  • ExpressionHelper.GetExpressionText

  • ExpressionMetadataProvider.FromLambdaExpression

在 .Net Core 2.2 之前的版本,这两个方法是逃不过的。可惜不巧的是,微软却认为这些方法没有公开的价值,因此就武断的隐藏掉了(你让之前使用这些类的程序情何以堪!)。

在 ASP.NET Core 3.1 虽然有替代的方法可以实现上述被删掉的功能,但是就做不到向后兼容了。FineUICore近期已经升级到 FineUICore v6.2.0,以便适用这个改动,升级之后支持 .Net Core 3.1+,不再对老版本提供支持了。

升级到 ASP.NET Core 3.1

下面我们会以 FineUICore.Examples 为例,讲解如果将 ASP.NET Core 2.1 升级到 ASP.NET Core 3.1,这里面的坑还真不少。

项目文件(.csproj)

32d2d024a7977d9be76e00d3e2d1086d.png

这里面有几点需要注意:

1. TargetFramework 改为 netcoreapp3.1

2. 删除 Microsoft.AspNetCore.App 的引用,这个会默认包含在框架 Sdk=Microsoft.NET.Sdk.Web 中

3. 添加 Microsoft.AspNetCore.Mvc.NewtonsoftJson 的引用

有一点需要特别注意, .Net Core 3.0 已经从共享框架中删除了 Newtonsoft.Json,并引入新的 System.Text.Json 类库。

但是我们的 FineUICore 示例代码很多地方都依赖了 Newtonsoft.Json 的特性,因此需要引入 Microsoft.AspNetCore.Mvc.NewtonsoftJson,这个引用会自动包含 Newtonsoft.Json 库,可以求证于编译时的 Debug 文件夹,位于项目的 \bin\Debug\netcoreapp3.1:

0e7c459a28431308ab7cbe412acb20dc.png

完整的项目工程文件:

3f8ce97730ecb115fc0ec8b9fa25bfd1.png

Program.cs

ae12de690ee9211c6320f622fd0dc2ad.png

需要注意的几点:

1. 将 IWebHostBuilder 改为  IHostBuilder

2. 将 Web 服务器的启动代码放到 ConfigureWebHostDefaults 中

当然,这些改动我们不需要特别关心,简单的照做就行了。

完整的 Progam.cs 代码:

e5429ec31478950a475f405920ee02fc.png

Startup.cs

这里的改动有点多,我们分两个截图分别说明 ConfigureServices 和 Configure 的改动:

486e122a7a601ae62315e086c7d1510c.png

这里有几点需要调整:

1. 用 AddControllersWithViews 替代 AddMvc

2. 对参数 ModelBinderProviders 更改放到 AddMvcOptions 中

3. 添加 AddNewtonsoftJson 用来使用老的 Newtonsoft.Json 来序列化 JSON 数据

ASP.NET Core 3.1 添加了三个新的服务注册方法来代替之前的 AddMvc:

  • AddRazorPages:添加对 Razor Pages 的支持

  • AddControllersWithViews:添加对控制器和视图的支持

  • AddControllers:添加对控制器的支持

这些方法可以组合,比如如下代码等效于之前版本的 AddMvc:

a1a0088605bb1e870ae9d26d806819b1.png

这个方法的完整代码:

414d6797700d7c8b5b8aaf34b1e455e9.png

下面来看下 Configure 方法:

c8fc62eef2bfc7ca0f570a2976f2e23f.png

这里面有几点重要改动:

1. 将 IHostingEnvironment 改为 IWebHostEnvironment

2. 添加 app.UseRouting();app.UseAuthorization();,注意添加的位置,要放到 UseStaticFiles 的后面

3. UseMvc 改为 UseEndpoints

完整的函数代码:

66541c0e2ddaef6374dcf3ac3852e1ae.png

2156778b0c24f27e12a85c576a0d5a51.png

对于支持 Razor Pages 的项目,这里的 UseEndpoints 代码要改为:

653747bc54da3e18275734784a03656f.png

ViewBag 与 Razor Pages 第一次接触

在传统的 Controller/Model/View 的 MVC 架构中,我们可以在控制器中使用 ViewBag 将数据传递到 视图中,虽然 ViewBag 只是字典类 ViewData 的一个动态封装,但是写法更简单:

595ad969f5ac68b6ed02225e02b821a3.png

然而在 Razor Pages 的页面模型类中,却少了对 ViewBag 的支持,因此在 ASP.NET Core 2.2 之前的版本里,我们通过在基类中新增一个 ViewBag 属性来解决:

8eb5f064f794e23bb3205293f9c2704b.png可以看出,这里的 ViewBag 其实是一个 dynamic 类型,内部存储单元还是 ViewData。

这么一个看似很技巧的东西其实来自微软某位程序员的自(zi)信(da),如果你留意观察,就会发现一个奇怪的逻辑:

  • Controller 基类 和 View 视图中支持 ViewBag

  • Razor Pages的后台模型类中不支持 ViewBag,然后 Razor Pages的页面中支持 ViewBag

说白了,微软的逻辑是:你可以在 Razor Pages 中使用 ViewBag(尽管也可以设置) ,但是别在模型类中设置 ViewBag。

这位大虾(DamianEdwards)在一个 Github 的 issue 中提到这样一个观点:

We purposefully didn't add ViewBag because I wanted to discourage its use. As @pranavkm points out you can add it back easily enough if you wish but I don't have plans to add it back to the built-in base class.

我带点感情色彩的翻译一下哈:

我就看 ViewBag 不顺眼了,所以故意不添加 ViewBag。并且我也不准备在以后的版本中把 ViewBag 加回来,你非要用的话自己弄吧!

在另一个回复中,DamianEdwards提到了 ViewBag 可能有性能问题:

ViewBag uses dynamic which in our testing introduces a measurable performance impact on the processing of pages or views that use it.

不过,这个决定权不能留给用户自己吗?如果我只是想通过 ViewBag 传递两三个数据,绝对不会遇到什么性能问题,并且这应该是 90% 的应用场景。

最终,吐槽归吐槽,代码是你写的,你想咋搞就咋搞。

ViewBag 与 Razor Pages 第二次接触

然而,在升级到 ASP.NET Core 3.1 之后,这个地方又报错了。

原因我们前面提过,对 ViewBag 的封装用到了 DynamicViewData,这个类是定义在 Microsoft.AspNetCore.Mvc.ViewFeatures.Internal 里面的。而在 ASP.NET Core 3.1 中,微软删除 Microsoft.AspNetCore.Mvc.ViewFeatures.Internal 的公开访问权限。

在实际项目中,我们还是要遵循微软的建议,使用 ViewData 而不是 ViewBag。

然而我们的 FineUICore 示例项目有 750 多个页面,很多地方都用到了 ViewBag,为了和之前的版本兼容,我们还是要把 ViewBag 找回来。

既然 DymaicViewData 不见了,就自己创建一个 DymaicViewData:

177fd9adef6af3c59df5661fcfb05d2e.png

6e8bd9c0ce6f065fab8aa9acd207e25f.png

在后台模型类基类中,调用方法改为:

c1726c0454685ad7804d0b4d77e96bf3.png

小结(文件改动对比图)

综上所述,升级到 ASP.NET Core 3.1 主要改动三个项目文件,其他地方基本没有变化。

为了更直观的查看这三个文件的改动,我们做了下面三幅对比图片(以FineUICore.EmptyProject项目为例)。

1. 项目工程文件(FineUICore.EmptyProject.csproj)

68b78b639f62b8bc1072da8e7a1b9993.png

2.Program.cse4d0e44eb7e1fa56fc71b2b271a15c11.png

3.Startup.csb3c1de9219d3c2abe0057bd77a12faf3.png

7cbccf8872d8611eba8a4e13cc570e4e.png

ASP.NET Core 3.1的确很棒,肉眼可见的快、快、快!

刚把 FineUICore 的官网示例部署到服务器时,管理员是这么给我说的:

bbeae3afbd58b8b26b8c7b202d32d336.png

之前一直没有注意,看来 ASP.NET Core 的性能的确是要好一些。

我对比了 FineUIPro(WebForms) 和 FineUICore(ASP.NET Core) 的在线示例网站,发现 ASP.NET Core 3.1 的确比 WebForms 快多了。

肉眼可见的快、快、快,下面两个动画图片可见一斑:

42743df452c5b0f665bd0155dfe1737e.gif

2872061f03bcd0fce8464d9f0c78b6b2.gif

这两个站点部署在同一台服务器的同一个IIS里面,为了便于区分,FineUICore(ASP.NET Core)为深色主题,FineUIPro(WebForms)为浅色主题。 

注:由于是共享服务器,所以服务器资源在不同时刻会有变化,并且网络环境也是不断变化的,可以在同一时刻(测试间隔小于1s)多次测试两个网站。 

当然每个人测出来的结果会不尽相同,欢迎分享你的测试截图.... 

欢迎关注“新阁上位机编程”抖音号

不定期发布上位机实用小技巧哦

快来学习互粉呀~d230eeeaacce50ba04ec07e8e2dbbd8f.png

(长按下方图片?保存到手机相册,打开抖音扫码关注哦!相信你肯定会1ab359f6554ff57ba936f08fd2b6de86.png)

4f47f7420f750602a779212048c58dcc.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
论坛演示地址: http://netfocus.b13.cnwg.cn 论坛功能设计  论坛前台: 1. 用户注册、登陆、注销; 2. 版块导航:显示所有的版块分组和版块; 3. 帖子列表:显示当前版块下所有的帖子,可以区分置顶帖子、精华帖子、推荐帖子; 4. 帖子内容:显示帖子内容; 5. 帖子回复:显示帖子的回复列表; 6. 添加帖子:用户添加新帖; 7. 添加回复:用户添加回复; 8. 精华帖子列表:显示所有的精华帖子; 9. 推荐帖子列表:显示所有的推荐帖子; 10. 帖子管理:具有帖子管理权限的人对帖子进行管理; 11. 回复管理:具有帖子回复管理权限的人对帖子回复进行管理;  论坛后台: 1. 版块组管理:添加、删除、修改; 2. 版块管理:添加、删除、修改,添加或修改时通过下拉框选择版块组; 3. 版主管理:可以管理论坛中每个版块的版主,如添加、删除版主; 4. 用户管理:查看用户资料、删除用户、封锁用户、解锁用户、重置密码; 5. 角色管理:添加、删除、修改; 默认定义如下角色: 系统管理员、用户管理员、角色管理员、版块管理员、版主管理员、版主、所有者、注册用户、所有人;其中所有者指发帖人,回复人;另外系统管理员、注册用户、所有者、所有人是内置角色,不能修改或删除;下面分别对每种角色的含义进行说明: 1) 系统管理员:拥有论坛所有权限; 2) 用户管理员:拥有用户管理权限; 3) 角色管理员:拥有角色管理权限; 4) 版块管理员:拥有版块管理权限; 5) 版主管理员:拥有版主管理权限; 6) 版主:拥有所有论坛事务管理权限; 7) 所有者:拥有对自己发表的帖子或回复的内容进行修改的权限;(此角色可以考虑禁用,出于数据真实性考虑,因为任何人都要对他或她所说的言行负责,不允许随便修改); 8) 注册用户:拥有一部分论坛事务,如看帖,发帖,回帖,管理和自己相关的一些帖子; 9) 所有人:这个角色只是一个映射角色,任何登陆网站的人都自动拥有此角色;此角色可以表示匿名用户;仅拥有此角色的人一般只能看帖,不能做其他任何事情。当然如果愿意,我们也可以给它分配更多的权限,如发帖,回帖。如果这样,那就意味着运行匿名用户发帖或回帖了。 6. 用户角色管理:对任意一个用户的所属角色进行管理(包括添加和删除用户所属角色); 7. 角色权限管理:分为两类进行管理; 系统管理权限:用户管理、角色管理、版块管理、版主管理; 论坛事务管理权限:浏览帖子、发表帖子、编辑帖子、置顶帖子、设为推荐帖子、设为精华帖子、删除帖子、修改回复、删除回复; 因为权限分为两种,所以角色权限管理也可以采用两个界面实现。这两个界面的行就是所有角色,列就是当前权限类型下的所有权限点。 8. 头像设置:设置用户的头像; 9. 密码修改; 10. 我的帖子管理:有我发布的帖子,我回复的帖子; 另外,一个论坛可能还常常有星级评定,积分设置,界面管理,等等其他辅助功能。这些东西可以在日后慢慢补充。
最新版本下载地址: http://download.csdn.net/source/823721 论坛功能设计  论坛前台: 1. 用户注册、登陆、注销; 2. 版块导航:显示所有的版块分组和版块; 3. 帖子列表:显示当前版块下所有的帖子,可以区分置顶帖子、精华帖子、推荐帖子; 4. 帖子内容:显示帖子内容; 5. 帖子回复:显示帖子的回复列表; 6. 添加帖子:用户添加新帖; 7. 添加回复:用户添加回复; 8. 精华帖子列表:显示所有的精华帖子; 9. 推荐帖子列表:显示所有的推荐帖子; 10. 帖子管理:具有帖子管理权限的人对帖子进行管理; 11. 回复管理:具有帖子回复管理权限的人对帖子回复进行管理;  论坛后台: 1. 版块组管理:添加、删除、修改; 2. 版块管理:添加、删除、修改,添加或修改时通过下拉框选择版块组; 3. 版主管理:可以管理论坛中每个版块的版主,如添加、删除版主; 4. 用户管理:查看用户资料、删除用户、封锁用户、解锁用户、重置密码; 5. 角色管理:添加、删除、修改; 默认定义如下角色: 系统管理员、用户管理员、角色管理员、版块管理员、版主管理员、版主、所有者、注册用户、所有人;其中所有者指发帖人,回复人;另外系统管理员、注册用户、所有者、所有人是内置角色,不能修改或删除;下面分别对每种角色的含义进行说明: 1) 系统管理员:拥有论坛所有权限; 2) 用户管理员:拥有用户管理权限; 3) 角色管理员:拥有角色管理权限; 4) 版块管理员:拥有版块管理权限; 5) 版主管理员:拥有版主管理权限; 6) 版主:拥有所有论坛事务管理权限; 7) 所有者:拥有对自己发表的帖子或回复的内容进行修改的权限;(此角色可以考虑禁用,出于数据真实性考虑,因为任何人都要对他或她所说的言行负责,不允许随便修改); 8) 注册用户:拥有一部分论坛事务,如看帖,发帖,回帖,管理和自己相关的一些帖子; 9) 所有人:这个角色只是一个映射角色,任何登陆网站的人都自动拥有此角色;此角色可以表示匿名用户;仅拥有此角色的人一般只能看帖,不能做其他任何事情。当然如果愿意,我们也可以给它分配更多的权限,如发帖,回帖。如果这样,那就意味着运行匿名用户发帖或回帖了。 6. 用户角色管理:对任意一个用户的所属角色进行管理(包括添加和删除用户所属角色); 7. 角色权限管理:分为两类进行管理; 系统管理权限:用户管理、角色管理、版块管理、版主管理; 论坛事务管理权限:浏览帖子、发表帖子、编辑帖子、置顶帖子、设为推荐帖子、设为精华帖子、删除帖子、修改回复、删除回复; 因为权限分为两种,所以角色权限管理也可以采用两个界面实现。这两个界面的行就是所有角色,列就是当前权限类型下的所有权限点。 8. 头像设置:设置用户的头像; 9. 密码修改; 10. 我的帖子管理:有我发布的帖子,我回复的帖子; 另外,一个论坛可能还常常有星级评定,积分设置,界面管理,等等其他辅助功能。这些东西可以在日后慢慢补充。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值