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

Jen*_*enB 21 .net c# asp.net asp.net-mvc asp.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服务器上运行它需要多少读取/试验 - 最终这才是最重要的.

Ger*_*vis 19

下面的答案已经过时,但概述了将.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应用程序(功能).是的仍然在Windows上,但我们越来越接近跨平台兼容性.

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

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

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

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

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

  • 谢谢Gerald,非常有见地.有趣的是看到2016年的更新答案(即使更新有相同的结论),因为此SO问题出现在Google搜索结果的顶部. (2认同)

orh*_*ndi 7

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

对的,这是可能的.

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

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

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

  <Exec Command="bower install" />
</Target>
Run Code Online (Sandbox Code Playgroud)

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?}");
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

中期测试请做以下

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

<h1>Hello world!</h1>
Run Code Online (Sandbox Code Playgroud)

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

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

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

8)复制About.cshtml,Contact.cshtml以及Index.cshtml从ASP.NET MVC项目的ASP.NET核心项目Razor视图文件.

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.cshtmlASP.NET Core MVC中的文件未更改.

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

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

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

  • 替换@Styles.Render("~/Content/css")<link>要加载的元素bootstrap.css
  • 删除@Scripts.Render("~/bundles/modernizr").注释掉该@Html.Partial("_LoginPartial")行(用行包围行)@*...*@).
  • 替换@Scripts.Render("~/bundles/jquery")<script> 元素.
  • 替换@Scripts.Render("~/bundles/bootstrap")<script>元素.


Cla*_*ies 5

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

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

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

话虽这么说,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的论点可能没有实际意义,即使它可能是一个提到的问题.