【问题标题】:Migrate to .NET Core from an ASP.NET 4.5 MVC web app [closed]从 ASP.NET 4.5 MVC Web 应用程序迁移到 .NET Core [关闭]
【发布时间】:2015-08-20 16:18:12
【问题描述】:

我刚刚接到了一项我不太熟悉的技术的任务 - 我们可爱的 Windows ASP.NET MVC Web 应用程序应该转换为在 linux 环境中使用。

我从事健康工作,我们拥有绝对不会丢失的用户数据,否则(我们的或他们的)人头就会滚动。

我通常不是 C#/ASP.NET 专家——尽管我可以适应这项任务。我一直在阅读@http://docs.asp.net/en/latest/getting-started/installing-on-linux.html 的官方文档,并且可以看到该任务实际上意味着“以 .NET CORE(或单声道)框架为目标”。

我已经四处搜索,似乎没有事实上/简单的迁移方法 - 只需学习新的模块化设置,并将配置放入 project.json 中,然后就可以了!在我尝试手动执行此操作之前 - 你们有什么信息可以告诉我吗?要遵循一些系统流程?也许我应该事先阅读一些“陷阱”?

该项目使用 NHibernate 和 Autofac 进行 DI - 看起来很标准。我只是想知道要让它在 linux 服务器上运行需要多少阅读/实验——最终这才是最重要的。

【问题讨论】:

  • 恕我直言,现在坚持在单声道上运行您现有的项目。核心有点太新了(更不用说从开发角度来看新的工作流程了)。这并不是说它不成熟,但如果安全是一个问题,我会坚持使用一些开发人员没有深入的东西。循环。
  • @BradChristie 它目前在 Windows 上!但是感谢您的建议 - 我想我会在那里查看一些单声道指南..
  • 很遗憾,您还不能将 NHibernate 或 Autofac 与 .Net Core 一起使用 - 我不相信两者都已转换。你是对的,这是一个非常手动的转换。祝你好运...

标签: c# asp.net .net asp.net-mvc asp.net-core


【解决方案1】:

以下答案已过时,但概述了将 .Net 4.5 MVC 应用程序更新到 .Net Core 框架的有效解决方案。 .Net Core 已准备好投入生产

Core CLR 和 BCL 尚未准备好投入生产。时期。至少现在还没有,可能六个月到一年都不会。在这一点上,依赖支持更是一个未知数。 Autofac 没有核心 clr 兼容库。他们会吗?那是开始研究的地方。他们什么时候会?这可能需要一段时间,这是您无法控制的项目要求。

即使对于非生产性工作,.NET core 仍然很早。简单的答案是告诉你的老板等六个月,看看一切如何摆脱,而不是潜在地消耗数百个工时或预生产代码。当然,这很可能会被忽略,所以如果我绝对必须这样做,这就是我今天将如何进行。

在您的问题中有几个变化。您希望从 ASP.NET 4.5 迁移到 ASP.NET 5。您还希望以新框架为目标。最后,您计划在新环境中运行该解决方案。这些中的每一个都可以独立处理(尽管有些不是在其他之前)所以这就是我要采取的路线。

第 0 阶段) 4.5.1 之前的 .Net 框架版本不支持 DNX。您将使用 DNVM 选择要定位的 DNX。您不能针对不可用的内容,因此如果您的项目当前针对的是 4.5.1 之前的内容,请更新该内容并验证没有重大更改。如果有修复并保持 condebase 与 4.5.1 或更高版本兼容。


第 1 阶段) DNVM 和 DNX 与现有的“完整”.Net Framework (4.5.1+) 和 .Net Core (5.0) 兼容。直接跳到在 .Net Core 5 上运行的 ASP.NET 5 可能很诱人,但那将是一个错误。由于 .Net Core 需要基于 dnx 的项目,而基于 dnx 的项目也支持 .Net 4.5.1(或更高版本),所以第一步是切换到 asp.net 5 引入的新项目结构。这可能需要一些实验在这一点上,文档是简陋的。目标是您现有的应用程序(在 dnx 中运行的 .net 框架 4.5.1 上运行的 asp.net 4.5。没有项目迁移向导,因此您将从一个新的 dnx 项目开始(使用 asp.net 5“空”模板)并复制到您现有的代码中。这似乎是一个微小的变化,但它打破了应用程序与仅 Windows 主机上已安装框架的紧密耦合。一旦您在 dnx 环境中运行代码库,您就奠定了基础针对其他环境。

第 2 阶段) 迁移到 asp.net 5 (MVC 6)。您仍将针对“完整”.net 框架并在 Windows 上运行。 .Net 核心不(也永远不会)支持您项目的现有 asp.net 版本(4.5)。然而,asp.net 5 与完整框架 (4.x) 和核心 (5) 都兼容。这使您能够升级到 asp.net 5 而无需切换到 .net 核心。第 2 阶段结束时的目标是使用在 dnx 中的 .net 4.x 上运行的 asp.net 5 的 Web 应用程序(功能性)。是的,仍然在 Windows 上,但我们越来越接近跨平台兼容性。

第 3 阶段) 列出 .net 核心不支持的现有 BCL 引用和依赖项的清单。重构 .net 核心不支持的现有 BCL 引用。请记住,.net core 是完整框架的一个子集,因此您可能会很幸运,并且所有现有代码都满足该子集,但如果您不满足,则需要找到一种方法来实现与 .net core 中可用的子集相同的功能。

对于依赖项(即 Autofac),您很可能需要升级,并且可能存在需要解决的重大更改。第 3 阶段的目标和结束是第 2 阶段的 Web 应用程序,但没有任何与核心 bcl 不兼容的依赖项。您无法控制的最大因素是第三方软件包。如果 autofac 没有发布与核心 clr 兼容的包,那么您将被卡住(或者需要考虑使用替代方案)。

第 4 阶段) 第 3 阶段结束意味着您拥有一个兼容 .net 核心的堆栈,但您仍然以完整框架为目标。现在最后您将目标切换到核心 clr(dnvm 支持多个并排运行时 = dnx)。此时我仍然会部署到 Windows,一次一个变量。在第 4 阶段结束时,您将在 Windows 环境中托管的 .net 核心上运行 Web 应用程序。

第 5 阶段)。现在您可以着手解决任何 Windows 依赖项。至少要从 IIS 迁移,确保任何路径处理都以操作系统中立的方式完成,并且不调用 Windows 特定资源(如注册表)。至此,核心 clr 和 bcl 应该更加成熟,因此您不会试图瞄准移动的目标。

在我看来,一次完成所有事情是灾难的根源。有了这么多并行更改,您将从一个非功能性解决方案开始,它可能会保持非功能性。通过分阶段进行,您可以将解决方案迁移到交叉兼容的目标,同时在每个步骤中仍然具有功能输出。

【讨论】:

  • 感谢杰拉德,非常有见地。看到 2016 年的更新答案会很有趣(即使更新有相同的结论),因为这个 SO 问题出现在 Google 搜索结果的顶部。
  • 这里有很多好的建议,但值得注意的是,从 ASP.NET Core RC2 开始,DNVM 和 DNX 不再使用太多。 RC2 现在改用 dot net cli。在这里阅读更多:dotnet.github.io/docs/core-concepts/dnx-migration.html
【解决方案2】:

我知道这是个老问题,但我猜需要更新。因为一些生产应用程序将 asp.net mvc 迁移到 asp.net core。我收集了一些一步一步的迁移。我希望它会有用。

是的,这是可能的。

1) 创建一个新的空 ASP.NET Core Web 应用,其名称与上一个项目相同。所以命名空间会匹配。

2) 安装 Microsoft.AspNetCore.Mvc 和 Microsoft.AspNetCore.StaticFiles NuGet 包。 ASP.NET 运行时是模块化的,您必须明确选择提供静态文件

3) 打开 .csproj 文件并添加一个PrepareForPublish 目标: 例如

  <Exec Command="bower install" />
</Target>

4) 打开 Startup.cs 文件并更改代码以匹配以下内容:

namespace WebApp1
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseStaticFiles();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

5)添加一个Controllers文件夹。然后将名称为HomeController.cs的MVC控制器类添加到Controllers文件夹中。

  • 添加视图文件夹。
  • 添加 Views/Home 文件夹。
  • 将 Index.cshtml、MVC 视图页面添加到 Views/Home 文件夹。

对于中期测试,请执行以下操作

将 Views/Home/Index.cshtml 文件的内容替换为以下内容:

<h1>Hello world!</h1>

6) 从 ASP.NET MVC 项目迁移功能。我们需要移动以下内容:

  • 客户端内容(CSS、字体和脚本)
  • 控制器
  • 观看次数
  • 型号
  • 捆绑
  • 过滤器
  • 登录/注销、身份

7) 将每个方法从 ASP.NET MVC OldController 复制到 NewController

8) 将 About.cshtml、Contact.cshtml 和 Index.cshtml Razor 视图文件从 ASP.NET MVC 项目复制到 ASP.NET Core 项目。

9) 运行 ASP.NET Core 应用并测试每个方法。

10) 对于静态内容,将名为 bower.json 的 Bower 配置文件添加到项目根目录(右键单击项目,然后添加 > 新项目 > Bower 配置文件)。将 Bootstrap 和 jQuery 添加到文件中

11) 将旧 MVC 项目中的 favicon.ico 文件复制到 ASP.NET Core 项目中的 wwwroot 文件夹中。

12) 将 _ViewStart.cshtml 文件从旧 ASP.NET MVC 项目的 Views 文件夹复制到 ASP.NET Core 项目的 Views 文件夹中。 _ViewStart.cshtml 文件在 ASP.NET Core MVC 中没有改变。

13) 创建一个 Views/Shared 文件夹。

14) 将 _Layout.cshtml 文件从旧 ASP.NET MVC 项目的 Views/Shared 文件夹复制到 ASP.NET Core 项目的 Views/Shared 文件夹中。

15) 更改 razor 视图中的一些旧功能,包括以下新闻

  • 将@Styles.Render("~/Content/css") 替换为&lt;link&gt; 元素 加载bootstrap.css
  • 删除@Scripts.Render("~/bundles/modernizr")。 注释掉 @Html.Partial("_LoginPartial") 行(围绕 与@*...*@)一致。
  • 将@Scripts.Render("~/bundles/jquery") 替换为&lt;script&gt; 元素。
  • 将@Scripts.Render("~/bundles/bootstrap") 替换为 &lt;script&gt; 元素。

【讨论】:

    【解决方案3】:

    我认为您在这里混淆了担忧。您最初的问题陈述是您有一个当前在 Windows 上运行的 MVC 应用程序,它需要在 Linux 上运行。这本身不是问题。然后你继续说你研究过它,得出的结论是你需要安装 ASP.Net 5(核心)才能在 Linux 上使用你的网站,这是错误的。

    ASP.Net MVC 项目在Mono 中运行良好。

    Mono 是基于 C# 的 ECMA 标准和公共语言运行时的 Microsoft .NET Framework 的开源实现。

    话虽如此,Mono 是一个开源实现。 ASP.Net 5 是 Microsoft 的官方产品,但它不直接向后兼容现有的代码库。它也运行在 Mono 之上。

    您应该与您的项目经理一起评估您的要求,以确定使用 Mono 是否可以接受;在一些敏感领域(例如医疗保健),开源并未被广泛接受。准备好解释一下,虽然 Mono 框架是开源的,但在 Mono 框架中运行的应用程序却不是。然而,一般而言,采用 Linux 的组织使用的开源软件比他们意识到的要多,无论他们是否愿意。

    最重要的是,您绝对可以在 Linux 上运行您的 MVC 应用程序,而无需使用 Mono 框架对代码库进行很多更改。如果使用官方的 Microsoft ASP.Net 5 Linux 发行版是项目要求,那么无论如何您都将重写应用程序的很大一部分,甚至在关注 Linux 与 Windows 之前。

    另外一个需要注意的附录,无论如何,ASP.Net 5 几乎完全是来自 Microsoft 的开源,因此反对使用 Mono 的论点可能没有实际意义,尽管它可能会被提及。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 2017-07-21
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多