从ASP.NET 4.5 MVC Web应用程序迁移到.NET Core

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

我在健康方面工作,我们拥有绝对不会丢失的用户数据或头部会滚动(我们或他们的)。

我通常不是C#/ ASP.NET人 – 尽管我可以适应这项任务。 我一直在阅读官方文档@ http://docs.asp.net/en/latest/getting-started/installing-on-linux.html并且可以看到这个任务实际上意味着’瞄准.NET CORE (或单声道)框架’。

我已经google了,似乎没有事实上/简单的迁移方式 – 只需学习新的模块化设置,将配置文件打入project.json即可离开! 在我尝试手动执行此操作之前 – 您有什么信息可以告诉我吗? 一些系统化的流程要遵循? 也许我之前应该读过一些“陷阱”?

该项目使用NHibernate和Autofac进行DI – 似乎非常标准。 我只是想知道在Linux服务器上运行它需要多少读取/试验 – 最终这才是最重要的。

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

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

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

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

阶段0) 4.5.1之前没有DNX支持的.Net框架版本。 您将使用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引入的新项目结构。可能需要一些实验并且文档在这一点上是简洁的。 目标将是您现有的应用程序(运行在.net framework 4.5.1上的asp.net 4.5在dnx中运行。没有项目迁移向导,因此您将从一个新的dnx项目开始(使用asp.net 5“空”)模板)和复制你现有的代码。这似乎是一个小小的改变,但它打破了应用程序与仅在主机上安装的框架的紧密耦合。一旦你在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应用程序(function)。 是的仍然在Windows上,但我们越来越接近跨平台兼容性。

阶段3)获取.net核心不支持的现有BCL引用和依赖项的清单列表。 重构.net核心不支持的现有BCL引用。 请记住.net核心是完整​​框架的一个子集,因此您可能会很幸运,所有现有代码都符合该子集,但如果您不这样做,则需要找到一种方法来实现与.net核心中可用子集相同的function。

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

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

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

在我看来,尝试一气呵成是灾难的一种方法。 如此多的并行更改将从非function性解决方案开始,它可能仍然无法正常运行。 通过分阶段进行,您可以将解决方案迁移到交叉兼容的目标,同时在每个步骤仍然具有function输出。

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

对的,这是可能的。

1)创建一个与前一个项目同名的新的空核ASP.NET Web应用程序。 所以名称空间将匹配。

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

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

    

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文件夹。
  • 添加Views / Home文件夹。
  • 将Index.cshtml,MVC视图页面添加到Views / Home文件夹。

中期测试请做以下

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

 

Hello world!


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

  • 客户端内容(CSS,字体和脚本)
  • 控制器
  • 意见
  • 楷模
  • 捆绑
  • filter
  • 登录/注销,身份

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

8)将About.cshtmlContact.cshtmlIndex.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文件夹中。 ASP.NET Core MVC中的_ViewStart.cshtml文件未更改。

13)创建视图/共享文件夹。

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

15)使用以下新闻更改剃刀视图中的一些旧function

  • 元素替换@Styles.Render("~/Content/css")以加载bootstrap.css
  • 删除@Scripts.Render("~/bundles/modernizr") 。 注释掉@Html.Partial("_LoginPartial")行(用@*...*@)围绕该行@*...*@)
  • 元素替换@Scripts.Render("~/bundles/jquery")
  • 元素替换@Scripts.Render("~/bundles/bootstrap")

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

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

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

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

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

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

还有另外一个附录,ASP.Net 5几乎完全是来自微软的Open Source,因此反对使用Mono的论点可能没有实际意义,尽管它可能是一个提到的问题。