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了,只是使用上会有一些变化