在Visual Studio中从ASP.NET迁移到ASP.NET Core介绍与教程

82 阅读9分钟

ASP.NET Core是一个统一的、现代的.NET网络框架。将现有的ASP.NET应用程序迁移到ASP.NET Core有很多优点,包括更好的性能,跨平台支持,以及获得现代.NET网络平台的所有最新改进。但是,从ASP.NET迁移到ASP.NET Core可能是非常具有挑战性和耗时的,因为这两个框架之间存在许多差异。这就是为什么我们一直在努力提供库和工具,以执行从ASP.NET到ASP.NET Core的增量迁移,这样你就可以慢慢地将现有的ASP.NET应用程序一次迁移一块,同时仍然能够持续开发应用程序。我们一直在努力开发Visual Studio中的工具,以简化迁移体验,现在,增量ASP.NET迁移工具的新版本已经推出。

在之前的博文中,我们介绍了最初的预览工具和使用YARP和System.Web适配器进行增量迁移的指导,以及增加了对共享认证支持的第二个预览。在这篇文章中,我们将介绍Visual Studio的增量ASP.NET迁移工具扩展,并讨论其新功能和限制。这是一个非常早期的实验性版本,所以你可能会遇到一些问题。该扩展可以协助迁移过程,但仍然需要手动迁移步骤,包括解决剩余的编译和运行时错误。随着时间的推移,我们希望错误的数量能够减少。当使用这个工具时,建议你在需要回滚的情况下对你的代码使用源代码控制。在适当的时候,使用分支来将这项工作与你的其他修改隔离。我们希望你能试一试,并与我们分享你的经验!

要尝试最新的增量式ASP.NET迁移,请遵循入门指南

概述

在处理真实世界的ASP.NET应用程序时,迁移到ASP.NET Core的过程可能需要大量的时间。根据应用程序的不同,可能需要几天、几周甚至几个月。为了促进这样一个漫长的过程,如果你能在一段时间内逐步迁移你的ASP.NET应用程序的各个部分,那将是一件好事。为了做到这一点,我们可以配置一个新的ASP.NET Core应用,它可以补充你现有的ASP.NET应用。在Visual Studio中,安装完扩展后,你将通过选择Migrate Project开始迁移你的ASP.NET项目。当你调用Migrate Project时,会发生以下情况:

  • 一个新的ASP.NET Core项目被创建并添加到解决方案中。
  • ASP.NET Core项目被配置为YARP,以代理请求返回到原始ASP.NET项目。
  • 两个项目都将被配置为启动项目。

在经历了迁移项目之后,现在是创建一个新的提交并检查修改的好时机。

现在你可以开始将单个项目从ASP.NET项目迁移到ASP.NET Core项目。该工具提供了新的手势来帮助实现这一目标。目前,该扩展支持以下项目的迁移:

  • 控制器
  • 视图
  • 类别

要迁移项目,你可以在解决方案资源管理器中右击它们,然后选择迁移命令。当这个命令被调用时,扩展会分析所选的项目,以确定它依赖于哪些项目,并尝试迁移这些项目。在这个过程中,它可能会检测到一些不能迁移的项目,这些项目将需要手动迁移。

这个工具是为了补充我们现有的.NET升级助手工具。虽然.NET升级助手对升级Windows桌面和类库项目很有用,但这个新的增量式ASP.NET迁移工具为ASP.NET项目提供了更好的体验。

现在,我们已经对该扩展进行了高层次的概述,让我们用一个示例项目来试试。

迁移体验

让我们从一个非常基本的迁移体验开始。在这里,我从一个新的ASP.NET MVC(.NET框架)项目开始,我们想把它逐步迁移到ASP.NET Core。你要做的第一件事就是迁移该项目。在解决方案资源管理器中,右击项目并选择迁移项目。 image.png

调用后,界面会跳转到迁移页面,开始迁移工作。点击 "Start Migration"(开始迁移)来迁移该项目。请看下面的图片:

image.png

当你开始迁移时,它将引导你创建一个新的,或选择一个现有的ASP.NET Core项目。

启动项目也应该被配置成在你运行或调试你的应用程序时启动这两个项目。请求流显示在下面的图片中:

image.png

如果ASP.NET Core项目中实现了相应的路由,ASP.NET Core应用程序将处理该请求。否则,该请求将被代理到原始的ASP.NET应用程序来处理。现在已经配置好了,你可以逐步迁移ASP.NET项目中的项目。例如,你可以一次迁移一个单一的控制器(以及它的依赖关系)。

迁移单个项目

目前有三种类型的项目被支持迁移。控制器、类和视图。你可以使用迁移页面上的链接来开始,或者在解决方案资源管理器或编辑器中右击项目来开始项目迁移。如下图所示: image.png

image.png

继续并开始HomeController的迁移过程。在你调用Migrate Controller后,你会被带到迁移页面,其中列出了HomeController的依赖项。请看下面的图片:

image.png

在这个页面上,如果你想跳过迁移这些依赖项,你可以取消选择。稍后,如果需要,你可以重新运行HomeController的迁移,以迁移更多的依赖项或之前跳过的依赖项。当重新运行迁移时,它将跳过任何已经被迁移的资产,或者那些我们没有发现要应用的可操作的修改。在这里,你可以点击Migrate选择,开始迁移HomeController。点击之后,结果应该类似于下面的图片:

image.png

从进度条上我们可以看到,迁移已经成功完成,有8个项目被迁移了。在进度条下面的列表中,有两个不同的图标,代表了迁移依赖关系的状态:

  • status ok icon 该项目被成功迁移了。
  • status ok outline icon 项目被跳过进行迁移。
  • warning icon 报告了一个警告。
  • error icon 发生了一个错误。

这些图标应该给你一个关于该特定项目状态的高级指示。在 "输出 "窗口中,每个步骤都有更多的信息被执行。当经历这个过程时,你应该总是看一看输出窗口,以更好地了解发生了什么。项目被跳过的原因有几个,包括:该项目之前被迁移过,该项目不支持迁移,没有已知的行动来迁移所选的项目,以及其他原因。更多细节见输出窗口。让我们看一下这个操作之后的解决方案资源管理器:

image.png

你可以看到,这两个项目现在都有一个HomeController文件和HomeController支持的视图。迁移工具并没有删除已迁移的内容,那是留给你的,当你确信这个过程已经成功,并且你对结果感到满意时,你就可以删除。当一个请求进入应用程序,它将首先被路由到WebAppMvcCore项目。因为它包含了一个用于该路由的控制器(HomeController),Core项目将对该请求做出响应。你可以在这个时候删除WebAppMvc项目中的HomeController,以及相应的视图。需要注意的是,当前版本的迁移扩展并不试图迁移CSS、JavaScript等网页内容文件。此时,你需要手动将这些文件迁移到新的ASP.NET Core项目中。在这篇文章的底部还列出了其他已知的问题。如果你要运行这个应用程序,你会看到以下结果:

image.png 这里我们没有看到任何应用于视图的样式。这是因为布局文件没有被迁移,而底层内容文件也没有被迁移。你可以迁移_Layout.cshtml文件,这将给你一个很好的起点,但你会得到一些构建错误,因为ASP.NET应用程序的默认_Layout.cshtml文件使用了@Styles和@Scripts等帮助器,而这些帮助器在ASP.NET Core中不被支持。在未来的版本中,我们可能也能迁移这些类型的项目,但现在你需要手动修复它们。

从这里开始,你可以继续迁移ASP.NET应用程序中的其他项目。请确保利用源码控制,这样你就可以在迁移过程中创建检查点,以防你需要回滚任何已迁移的内容。

已知的问题

我们仍然处于支持增量ASP.NET迁移的早期阶段,在当前的预览体验中存在各种已知的问题和限制。

以下是目前不支持的一些迁移项目的高级列表。

  • 网络内容文件(即CSS/JS/等)不被迁移
  • 使用Entity Framework的类
  • 与.NET身份相关的文件
  • .NET框架类库项目
  • ASP.NET Web表单视图
  • Razor视图的迁移目前非常有限;目前不支持部分视图或布局文件
  • ASP.NET MVC领域

这并不是一个详尽的列表;有很多项目目前还不支持。

该扩展目前不支持的东西之一是引用的.NET框架类库。在这个时候,建议使用升级助手来迁移这些项目。在这个扩展的未来版本中,我们可能会增加对类库项目的增量迁移的支持。

提供反馈

我们想听听你的意见,我们如何才能最好地改善增量ASP.NET迁移的体验。与我们分享反馈的最佳地点是GitHub上的dotnet/systemweb-adapters repo。使用👍 反应,指出对你最重要的功能或改进。

以上是对这个新扩展的简要介绍。随着我们取得更多进展,我们将提供更多信息,你可以查看下面列出的其他相关资源。请在您现有的ASP.NET项目中试用它,并分享反馈意见,以便我们能够继续改进ASP.NET的增量迁移体验。

谢谢你,祝你编码愉快!

资源