从 ASP.NET Framework 迁移到 ASP.NET Core

将应用从 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。 关键是为特定情况选择合适的方法。

快速决策指南

回答以下问题以选择你的方法:

  1. 你的时间线和风险容忍度是什么?

  2. 应用程序有多大?

  3. 是否具有复杂的依赖项?

Incremental Migration

增量迁移是 Strangler Fig 模式的实现,最适合需要在整个迁移过程中继续保持生产的大型项目或项目。 请参阅 逐步将 ASP.NET 迁移到 ASP.NET Core 的方法,开始逐步迁移应用程序。

就地迁移

就地迁移适用于足够小的应用程序。 如果可能,这允许快速替换应用程序。 但是,如果你决定进行就地迁移,则小问题可能会复杂化。 请参阅 Learn 从 ASP.NET MVC、Web API 和 Web 窗体升级到 ASP.NET Core ,了解升级助手如何帮助进行就地迁移。