我迷失了,ASP.NET MVC 5发生了什么?

133
我一直低头忙于各种项目,显然微软一直在忙着做出一些重大改变,这让我感到很困惑。当我去年安装 Visual Studio 2017 并尝试创建新项目时,ASP.NET Core 首次引起了我的关注,突然间我可以选择 .NET Framework、.NET Standard 和 .NET Core。于是我稍微了解了一下,发现后两者在某种程度上是完整框架的缩写版本。我读了 Scott Hanselman 的这篇文章 ASP.NET 5 is dead - Introducing ASP.NET Core 1.0 and .NET Core 1.0,也发现了这篇文章: 选择 ASP.NET 或 ASP.NET Core。我的结论是“Core 是新的,你可以继续使用完整的框架”。因此,我使用 .NET Framework 4.6.2 和 Microsoft.AspNet.Mvc 5.2.3 创建了一个新的 ASP.NET MVC 站点。

自从创建这个项目以来,我发现 MVC 和 Entity Framework 中似乎存在一些 bug,但只有在 Core 中才能找到他们的相关信息,也只有在那里才被考虑修复。

现在,我想查找System.Web.Mvc.Controller和System.Web.Mvc.JsonResult的文档,但只能在核心文档下找到。最终我在这里找到了它:https://learn.microsoft.com/en-us/previous-versions/aspnet/web-frameworks/mt134468(v=vs.118),上面说它不再维护。
我已经理解了这个问题中关于核心的部分,我说:“好吧,我为什么要关心呢?我会继续做我正在做的事情,并在完成后回来检查。” 但现在似乎4.6.2甚至不再受支持。有人可以解释一下发生了什么吗?我的.NET 4.6.2 / MVC 5.2.3项目现在是否已经过时?如果没有,为什么文档被淘汰并隐藏了呢?我担心我的某些依赖项可能不可用或与核心不兼容。

12
我不能回答你所有的问题,但认为.NET Core只是完整框架的“简化版本”是非常错误的想法——在许多方面,.NET Core现在正在超越.NET Framework;两者都不是完全的子集。简而言之,“是的,.NET Framework会一直存在,但如果可以的话,你应该计划迁移到.NET Core”。你提到的依赖问题并不是微不足道的,但大多数常见的库已经支持.NET Core或.NET Standard。但没有人会强制你迁移,许多应用程序将继续无限期地使用.NET Framework。 - Marc Gravell
1
您可以将ASP.Net Core MVC项目定位为在完整的.Net Framework上运行。 - jmoerdyk
感谢@MarcGravell。我一直在阅读核心缺少某些功能并且由于正在从头开始重建,因此无法使用某些功能,但这还没有完成,但是没有人明确指出这些事情是什么。它是下一个.Net版本还是框架分成两个部分?我不想采用核心,然后发现它不支持过去版本中可用的某些重要功能。 - xr280xr
@MarcGravell:“你应该计划迁移到.NET Core” - 如果桌面应用程序必须迁移到DNX,我会感到非常不舒服:我的用户不需要为每个相对较小的应用程序包增加额外的20MB运行时和依赖项。那么核心运行时的安全更新呢?因为DNX应用程序是隔离的并且存在于它们自己的沙盒中,所以像我们可以使用.NET Framework一样无法一次性更新共享组件。DNX只适用于可以轻松从源代码重建的服务器应用程序,而不适用于面向最终用户的桌面应用程序。 - Dai
1
@Dai .NET Core 一个独立的部署选项(目前处于实验阶段),但您不需要使用它。虽然这可能使客户端应用程序更容易部署,但同意 - 这可能会让人心动。话虽如此:.NET Core 的版本更新速度比 .NET Framework 快得多;如果说你很可能更快地获得 .NET Core 的修复。但是,问题是:这个修复是否已经部署? - Marc Gravell
3个回答

407
(每当有新的.NET公告发布时,此答案都会定期更新,并已更新为ASP.NET Core 3.0、.NET 3和.NET 5的详细信息)

过去3年5年中,微软在.NET Core/DNX、ASP.NET Core、.NET Standard、.NET 5等方面造成了大量混淆,这需要给予严厉的批评。

(我是DevDiv的前全职SE,我这么说...("来自16号楼!"))

  • ASP.NET即“System.Web”已经停用,WebForms也已经停用(欢呼!)。
  • ASP.NET MVC于2008年推出,建立在ASP.NET之上,但绕过了大部分的WebForms基础设施。
    • ASP.NET MVC有自己的版本,与ASP.NETASP.NET Web API(以及ASP.NET Core)不同。您链接到的是ASP.NET MVC 5的文档,这与ASP.NET 5不同
  • ASP.NET Web API于2012年推出,是ASP.NET MVC的兄弟,它也建立在ASP.NET之上,但有自己的类库(System.Web.Http),与ASP.NET MVCSystem.Web.Mvc)没有共享。尝试将ASP.NET Web API服务与ASP.NET MVC Web应用程序组合在同一个项目中是一种痛苦的练习。
  • ASP.NET MVC 5于2014年推出,作为ASP.NET MVC 4的更新。它与ASP.NET 5无关。
  • ASP.NET MVC 6从未发布。它被合并到ASP.NET 5中,然后成为ASP.NET Core。它的目标是将ASP.NET MVC和ASP.NET Web API合并为一个平台。
  • ASP.NET Core于2016年推出,是ASP.NET MVC 5的改进设计,但没有依赖于System.Web.dll或任何(现在过时的)IIS依赖项(例如旧的请求管道,IHttpHandlerIHttpModule已不存在)。
    • 请注意,ASP.NET Core的类库根命名空间现在是Microsoft.AspNet而不是System.Web。这让我感到困惑。这意味着将项目从ASP.NET MVCASP.NET WebAPI升级到ASP.NET Core是非常困难的,尽管它们的基本控制器和中间件架构相同。
  • .NET Core是CLR和BCL的新版本,明确支持可移植性,并在Windows、Linux和macOS上运行。
    • .NET Core 1.0.NET Core 2.0的基类库与仅限Windows的full-fat.NET Framework相比较弱。
    • 随着.NET Core 3.0和WinForms、WPF和其他.NET Framework组件的开源化,.NET Core现在已经准备在Windows上作为新应用程序开发的.NET Framework替代品。
  • .NET 5将是.NET Core 3发布后的新名称(预计在2020年底左右发布.NET 5)。
    • .NET 5ASP.NET 5.0ASP.NET MVC 5 "ASP.NET Core in .NET" 似乎是针对 .NET 5 及以后版本特别定位于 ASP.NET Core 的首个正式名称。
      我注意到,“Core” 是微软当前一代与 .NET Core 兼容的 .NET 平台的热门品牌。 (就像微软在上世纪90年代把“Active”加到使用 COM 或 ActiveX 的东西上一样,例如 Active Desktop、Active Channels、ActiMates、Active Directory、ActiveSync 等)。
      此外,Entity Framework Core 仍缺少许多来自 Entity Framework 6 的功能,这是因为它是一个重写,但最终会达到平衡。

      因为目前有许多 .NET 运行时和 BCL 可用(包括 .NET Framework、.NET Core、UWP、Xamarin(使用 Mono)、Unity 等),所以微软推出了.NET Standard,其基本上是可移植类库概念的重新启动: 在此概念中,Visual Studio 项目针对已知子集的常见功能而不是特定实现进行目标设置。 (我只希望他们从 4 开始进行版本编号以匹配 .NET Framework 而不是从1.0开始,因为这让我想起了2001。) - 但重要的部分是ASP.NET Core 1ASP.NET Core 2针对的是 .NET Standard 而不是 .NET Core - 这意味着 ASP.NET Core 不仅在 .NET Core 上运行,还可以在 Windows 上的 .NET Framework 上运行。

      我注意到之前的所有 .NET 跨平台兼容技术现在都已经过时了(包括针对 Compact Framework 子集、可移植类库,甚至是 Visual Studio 中的“共享项目”),因为它们是为其他版本的 .NET 设计的,这些版本已经不存在了,比如 .NET Compact Framework、XNA、Silverlight 和 Windows Phone 7 的子集。
      在2019年5月,Microsoft 宣布了“.NET 5”。简而言之,.NET Framework 将被 .NET Core 取代,并且在 .NET Core 3.0 之后的下一个版本将被命名为 .NET 5)。这个声明并不涉及 ASP.NET Core,除了 .NET 5 将完全支持其上运行的 ASP.NET Core 3.0 应用程序之外。
      在2020年夏季的Covid主题期间,Microsoft完成了.NET 5和ASP.NET Core。截至2020年10月,ASP.NET Core的NuGet包版本已从3.1.x跳至5.0.0-因此看起来ASP.NET Core的下一个主要版本将被命名为“5.x.x”,这表明其发布可能被命名为“ASP.NET Core 5” ,尽管最近的Microsoft博客文章表明名称将是“ASP.NET Core for .NET 5”-但考虑到整个线程都是因为“ASP.NET MVC 5”与“ASP.NET 5”的混淆而创建的,我相信将其命名为“ASP.NET Core 5”或“ASP.NET Core for .NET 5”绝对不会有任何困惑。
      • ASP.NET MVC 5
        • ASP.NET MVC 5ASP.NET MVC 4 的短暂继任者。
        • 它于2014年与ASP.NET Web API 2一起发布。
        • 实际上,它运行在ASP.NET 4之上(即System.Web.dll的.NET 4.x版本)。请注意,整个ASP.NET MVC库现已过时。
      • ASP.NET 5已经停用并更名为ASP.NET Core,它内置了“ASP.NET MVC 5”的功能。
      • ASP.NET Core 1ASP.NET Core 2可以在.NET Core(跨平台)或.NET Framework(Windows)上运行,因为它们针对.NET Standard。
      • ASP.NET Core 3现在仅在.NET Core 3.0上运行。
      • ASP.NET Core 4不存在,从未存在过。
      • ASP.NET Core 5 存在(截至2020年8月),但其正式名称似乎是“ASP.NET Core for .NET 5”,它只能在.NET 5上运行。

      所有项目(按时间顺序):

      • ASP.NET 1 - 2001年推出。包括WebForms。运行在.NET Framework 1.0和1.1上。System.Web.dll
      • ASP.NET 2.0 - 2005年推出。包括WebForms。运行在.NET Framework 2.0上。System.Web.dll
      • ASP.NET MVC 1ASP.NET MVC 2 - 2008-2009年间推出。运行在ASP.NET 2.0之上。System.Web.Mvc.dll
      • ASP.NET 4.0 - 2010年推出。包括WebForms。运行在.NET Framework 4.0上。没有ASP.NET 3.0System.Web.dll
      • ASP.NET MVC 3ASP.NET MVC 4 - 2010-2013年间推出。运行在ASP.NET 4.0之上。System.Web.Mvc.dll
      • ASP.NET Web Api 1 - 2012年推出。运行在ASP.NET 4.0之上。System.Web.Http.dll
      • ASP.NET MVC 5 - 2013年推出。是ASP.NET MVC的又一次更新。运行在ASP.NET 4.0之上,但也可以在OWIN下独立运行,不需要System.Web.dll
      • ASP.NET Web API 2 - 2013年推出。是ASP.NET MVC 5的副产品。也可以在没有ASP.NET 4.0的情况下在OWIN下运行。
      • ASP.NET MVC 6 - 2014-2015年间推出。在达到发布候选版本状态后被取消,并于2016年重启为ASP.NET Core MVC 1.0,成为ASP.NET Core 1的MVC和Web API组件。
      • ASP.NET 5 - 2014年推出。是ASP.NET的重大改版(详见此处)。主要变化包括合并了MVC、Web Pages和Web API,并移除了WebForms。ASP.NET 5达到了发布候选版本状态,但随后被重新命名为ASP.NET Core。从未有过ASP.NET 6
      • ASP.NET Core 1 - 2016年推出。运行在.NET Framework 4.5.NET Core 1.0上。
      • .NET Core - 2016年推出。可移植和精简的.NET运行时和类库。
      • .NET Standard - 2017年推出。程序可以以一种方式来针对所有.NET实现(.NET Framework 4.5及以上版本、.NET Core 2.0及以上版本、Xamarin等)中都存在的一组公共功能。
      • ASP.NET Core 2 - 2017-2018年间推出,是我们今天使用的版本。运行在.NET Framework 4.6.1.NET Core 2.0上。(截至2018年底,现在有ASP.NET Core 2.1)。
      • ASP.NET Core 3 - 2018年10月下旬,微软宣布ASP.NET Core 3.0现在仅能在即将到来的.NET Core 3.0上运行(因此不再运行在.NET Framework 4.7.x上)。

        时间线和块图

        (我太沉迷于制作这个了...)

        Diagram with a timeline of ASP.NET and a block diagram showing how the components of .NET Framework, ASP.NET and ASP.NET MVC come together


60
微软确实需要敲打一下。作为一个新手进入ASP.NET领域,浏览这些听起来非常相似(却又非常不同)的技术是一项巨大的任务。你对澄清这个混乱局面的回答很棒。 - luckman777
4
图表右下方的红色框中... :) - Ashby
11
ASP.NET,又称“System.Web”,现在已经过时。WebForms也已经过时(好消息!)。为什么很多人会讨厌这个曾经很伟大的技术,即使现在它仍然可以通过一个免费的完整套件提供网站开发所需的一切。 - mz1378
8
WebForms拥有大量设计缺陷,使它无法与现代Web和可用性兼容。我不会一一列举,但其中,“postback”模型破坏了HTTP的RESTful语义。Viewstate经常无法正常工作,并导致请求大小膨胀。“Pages”本质上违反了松耦合原则。整个平台无法进行单元测试或集成测试。 - Dai
10
微软应该有一个针对理解微软所做的许多变化的认证考试。 - ammad khan
显示剩余19条评论

13

本答案将尽量只关注于ASP.NET MVC 5,并尽可能少涉及ASP.NET Core。

产品生命周期

微软仍然支持这个版本(所以幸运的是它不像其他答案中所说的是一个“短命”的版本),目前还没有停止支持的声明,

https://www.asp.net/support

框架/产品 退役时间

ASP.NET MVC 4 2019年7月1日

ASP.NET MVC 5

因此,如果您愿意,可以继续使用它(就像VB6和经典ASP用户一样,他们仍然得到了微软的支持)。

如果您查阅微软的产品生命周期文档,.NET Framework 4.5.2及以上版本仍然得到了充分的支持。

维护

但是,您需要注意ASP.NET MVC 5处于维护模式,因为现在几乎所有的开发资源都集中在ASP.NET Core上。

您可以获得以下内容:

  • 来自NuGet.org的不可预测的补丁发布。

如果您监控相关的NuGet包,您应该会注意到即使最近微软也会更新它们以补救安全漏洞等。

  • 锁定的文档。

你在 Microsoft Docs 上看到的通知,实际上强调了第一句话:“我们不再定期更新此内容。”这是非常有道理的,因为 ASP.NET MVC 5 很稳定,所以不应该再期望添加新材料。

  • 只有极少量的漏洞修复和新功能。

你说:“自从创建那个项目以来,我发现 MVC 和 Entity Framework 中似乎存在一些错误,但是发现网络上唯一提到它们的地方似乎是在 Core 中,那里是唯一正在考虑修复它们的地方。”

好吧,这真的取决于你所谈论的“错误”是什么。正如我之前所说,与安全相关的问题仍然被修补,但具有解决方法或功能限制的错误最不可能得到修复。它是一个开源项目,如果你真的想,可以自己修复这些问题,作为最后的办法。

在新功能方面,Microsoft 确实会从 ASP.NET Core 中反向移植一些功能,例如依赖注入、新配置系统,以简化某种程度上的迁移。但不要期望太多。

迁移

如果可以的话,请考虑迁移到 ASP.NET Core。


显然,他们现在要淘汰.NET Core,因此现在是规划、招聘和推荐的困难时期。 - Henrik Erlandsson

0
我发现维基百科这篇文章介绍中的这个片段,是对所选答案的一个很好的总结。同样的内容也可以在微软的博客文章中找到:https://devblogs.microsoft.com/dotnet/introducing-net-5/ (如果可能的话,我会链接每个提到的技术到它自己的维基百科文章,以供进一步阅读。)
ASP.NET MVC的最终版本发布日期为2018年11月28日。自那以后,ASP.NET Core已经发布,它统一了ASP.NETASP.NET MVC、ASP.NET Web API和ASP.NET Web Pages(一个仅使用Razor页面的平台)。MVC 6因Core而被放弃,不会被发布。目前计划将Core合并到“.NET 5”中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接