NetFramework4.5项目迁移至NetCore5.0
Net Framework4.5迁移至NetCore5.0
公司项目需要从Net4.5升级到Net5.0,以便加入NetCore生态(SkyWalking,Docker,Nacos…..)
使用升级助手,可以减轻一点前期的工作
使用 .NET 升级助手将.NET Framework应用迁移到.NET 5 - 张善友 - 博客园 (cnblogs.com)
项目原架构 EF+MVC+Razor+SignalR+WCF
小技术点
Mvc Bundling:聚合静态资源
Session
Cookie
ModelState
升级过程
- 使用微软助手进行升级(在助手迁移中途可能会出现NuGet包引起的错误,导致迁移中断,需要打开当前的项目,对包进行调整,不支持NetCore的库需要移除)
- 所有步骤完成后更新NuGet 部分包需要重新下载,因为原始的是Framework的版本,需要下载NetCore版本
- 修复各种报错…………………….
记录一下遇到的坑
Razor
- 静态聚合Bundling在NetCore不支持,不支持Scripts.Render,改写为模版的形式
- NetCore的Razor里不支持RazorHelpers,有用到RazorHelpers技术的需要改写,可使用静态方法处理
- Razor界面上直接使用@ 会对String类型进行html转义,需要通过Html.Raw进行处理
EF
迁移碰到问题会非常多,建议要么重新建模块,要么换其他的ORM,现在的ORM语法基本上都是Linq语法,改动量不会很大
ORM从EF变为FreeSql
EF里原有的状态保持可以使用FreeSql的仓储来做,也有状态保持,使用仓储的Attach
注意EF里使用到的Entry State和Reload,需要做对应处理
EF默认支持导航查询,FreeSql里也可以支持,开启懒加载
注意主键与表名(我们的表不在dbo架构下。。多个架构需要在实体类上加相应标签)
HttpContext Session
services.AddSession(options =>
{
//过期时间
options.IdleTimeout = TimeSpan.FromDays(1);
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});NetCore的Session使用了分布式存储库,只要实现相应接口就可以做到分布式 (使用封装的Furion.Extras.Caching.FreeRedis)
Net5里的Session的操作方法变了,需要使用SetString和GetString做相应操作
HttpContextCurrent已经移除了,使用HttpContextAccessor.HttpContext
注意在初始化时进行AddSession和UseSession处理
ModelState在Net5里使用时,若出现界面跳转的情况,会进行默认序列化,但是序列化又会失败,故若出现需要跳转界面的情况,不要使用ModelState+TempData,可以做特殊处理,然后存储到TempData里
SignalR
初始化时需要添加,且增加序列化工具,防止数据传输中有对象时会报错 添加包 Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson
services.AddSignalR().AddNewtonsoftJsonProtocol();
前端库有变更,使用aspnet-signalr库,方法调用处理上也变化了
//初始化
var hub = new signalR.HubConnectionBuilder()
.withUrl("/signalr")
.build();
//前端方法触发
hub.on("statusUpdate", data => {
});
//调用后端方法
hub.invoke("login",{a:1})
//连接开始
hub.start().then(function () {
})后端注册上有变化 和路由在相同地方注册
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<SaveStatusHub>("/signalr");
});Hub类调整
// 支持自动依赖注入
public class SaveStatusHub : Hub{
public SaveStatusHub(IFreeSql freesql){
}
}Mvc的Filter变化,改写方法
部分地方可能需要用到依赖注入,因为NetCore基本上都是依赖注入了,Framework还有很多New… 特别是涉及到EF的地方,可以使用Furion框架来做,包括异常拦截,依赖注入等
WCF在NetCore已经不支持了,移除改用其他的吧(WebApiClientCore ☺)
小结
一定要保证在迁移后有NetCore的库可以使用,否则需要自己造轮子,目前的共用组件基本上都支持到NetCore了,只是使用上会有一些变化