将应用从 ASP.NET Framework 更新到 ASP.NET Core 对于大多数生产应用来说并不简单。 这些应用通常会在新技术可用时将其纳入,并且通常由许多旧的决策组成。 本指南提供实用方法和工具,用于将 ASP.NET Framework 应用更新为 ASP.NET Core,尽量少做更改。
迁移为何具有挑战性
从 ASP.NET Framework 迁移到 ASP.NET Core 涉及几个复杂的挑战,使大多数生产环境应用程序全面重构变得困难且风险较大。
技术债务积累
生产应用程序在多年的开发中经常积累技术债务:
- System.Web 依赖项 - 在整个代码库中普遍使用 HttpContext 和关联的类型。
- 过时的包依赖项,可能没有现代兼容的等效项
- 与新式 .NET 不兼容的旧生成工具和项目配置
- 已弃用 API,需要用现代替代项替换
- 使迁移复杂化的编译器警告和代码质量问题
Cross-Cutting Concerns
许多应用程序具有跨多个层的跨领域问题,在迁移过程中需要仔细协调:
- 会话状态管理 - ASP.NET Framework 和 ASP.NET Core 具有完全不同的会话 API 和行为
- 身份验证和授权 - 框架之间的不同身份验证模型和 API
- 日志记录和监视 - 需要在迁移期间保持两个应用程序的一致日志记录
- 缓存策略 - 内存中、分布式或输出缓存需要保持一致
- 错误处理 - 跨两个应用程序建立一致的错误处理模式
- 配置管理 - 管理需要在应用程序之间共享或同步的设置
- 依赖项注入 - 从各种 DI 容器迁移到 ASP.NET Core 的内置容器
库依赖链条
支持库通常具有复杂的依赖关系,需要仔细安排升级的顺序。
- 依赖树的复杂性 - 库必须按照后序深度优先搜索顺序进行升级
- 多目标要求 - 库需要支持应用面向的所有框架版本。
- API 兼容性 - 确保库在迁移期间使用这两个框架版本
- 测试复杂性 - 每个库升级都需要彻底的测试,以确保兼容性
应用程序体系结构差异
ASP.NET Framework 与 ASP.NET Core 之间的根本差异会产生额外的挑战:
- 托管模型 - 应用程序托管和生命周期管理的不同方法
- 中间件管道 - 从 HTTP 模块和处理程序移动到中间件
- 请求处理 - 不同的请求处理模型和上下文
- 性能特征 - 不同的内存使用模式和性能概况
这些挑战使增量迁移成为大多数生产应用程序的首选方法,因为它允许团队逐步解决这些问题,同时在生产环境中维护工作应用程序。
关于已更改的重要领域的文档,请参阅复杂的迁移方案 - 深入探讨领域中提供的相关主题。
从此处开始:选择迁移路径
ASP.NET Framework 应用程序可以成功移动到 ASP.NET Core。 关键是为特定情况选择合适的方法。
快速决策指南
回答以下问题以选择你的方法:
你的时间线和风险容忍度是什么?
应用程序有多大?
是否具有复杂的依赖项?
Incremental Migration
增量迁移是 Strangler Fig 模式的实现,最适合需要在整个迁移过程中继续保持生产的大型项目或项目。 请参阅 逐步将 ASP.NET 迁移到 ASP.NET Core 的方法,开始逐步迁移应用程序。
就地迁移
就地迁移适用于足够小的应用程序。 如果可能,这允许快速替换应用程序。 但是,如果你决定进行就地迁移,则小问题可能会复杂化。 请参阅 Learn 从 ASP.NET MVC、Web API 和 Web 窗体升级到 ASP.NET Core ,了解升级助手如何帮助进行就地迁移。