最早的http://ASP.NET是在2002年推出的,当时微软热衷于保护其在传统桌面应用程序开发中的主导地位,并将互联网视为威胁。图1-1说明了当时出现的http://ASP.NET Web Forms技术栈。
图1-1 ASP.NET Web Forms技术栈
1.1.1 http://ASP.NET Web Forms
微软试图使用http://ASP.NET Web Forms将用户界面(User Interface,UI)模拟为服务器端控件对象层,隐藏超文本传输协议HTTP(本身是无状态的)和超文本标记语言HTML(当时许多开发人员对此还不熟悉)。每个控件在请求之间保持自己的状态,在需要时自动渲染为HTML,并将客户端事件(如按钮单击)与服务器端相应的事件处理程序代码相关联。实际上,Web窗体是一个巨大的抽象层,旨在通过Web传递经典的事件驱动的图形用户界面(Graphics User Interface,GUI)。
其思想是使Web开发的体验与开发桌面应用程序一致。开发人员可以基于有状态的用户界面进行考虑,而无须使用一系列独立的HTTP请求和响应。微软可以使Windows桌面开发人员向新型Web应用程序开发领域实现无缝转型。
http://ASP.NET Web Forms存在的问题
传统的http://ASP.NET Web Forms开发从原则上来说曾经很好,但事实证明它更加复杂。
关注点分离的错误理念:http://ASP.NET Web Forms的代码隐藏模型提供了将应用程序代码从HTML标记中移除到单独的代码隐藏类中的方法。这是为了分离逻辑层和表现层,但实际上,又鼓励开发人员将表现层代码(如操纵服务器端控件树)与其应用程序逻辑(如操纵数据库数据)混在这些怪异的后台代码类中。最终的结果可能是难以理解的。
对HTML的有限控制:服务器控件将其自身呈现为HTML,但不一定是你想要的HTML。在http://ASP.NET的早期版本中,HTML输出无法符合Web标准,或者不能很好地利用层叠样式表(CSS),并且服务器控件生成难以预测且复杂的ID属性,这些属性难以使用JavaScript访问。这些问题在最近的http://ASP.NET Web Forms版本中有所改进,但是获取你期望的HTML仍然是比较困难的。
有漏洞的抽象:http://ASP.NET Web Forms尽可能隐藏HTML和HTTP。当你尝试实现自定义行为时,你经常会放弃抽象,这迫使你对回发事件机制进行逆向工程,或执行笨拙的操作以使其生成所需的HTML。
低可测试性:http://ASP.NET Web Forms的设计人员无法预料到自动测试将成为软件开发的重要组成部分。他们设计的紧密耦合架构不适合单元测试。集成测试也可能是一个挑战。
http://ASP.NET Web Forms并非一无是处,实际上,微软为提高标准合规性和简化开发流程付出了巨大的努力,甚至从原始的http://ASP.NET MVC框架中获取了一些功能,并将其应用于http://ASP.NET Web Forms。当你需要快速的结果时,http://ASP.NET Web Forms表现优异,你可以在一天内拥有一个相当复杂的Web应用程序。但除非你在开发过程中足够小心,否则你会发现你创建的应用程序难以测试和维护。
1.1.2 起初的MVC框架
2007年10月,微软发布了一个基于现有http://ASP.NET平台的新开发平台,旨在直接回应对http://ASP.NET Web Forms的批评和竞争平台(如Ruby on Rails)的普及。新平台称为http://ASP.NET MVC框架,并反映了Web应用程序开发的新兴趋势,如HTML和CSS标准化、REST Web服务、有效的单元测试以及开发人员应该接受HTTP的无状态特性的想法。
支持最初MVC框架的概念现在看起来很自然而且显而易见,但是它们在2007年的.NET Web开发世界中是缺乏的。http://ASP.NET MVC框架的引入使微软的Web开发平台重新回到了现代。
MVC框架还表明微软的态度发生了重大变化,微软以前曾试图控制Web应用程序工具链中的每个组件。现在微软基于jQuery等开源工具构建了MVC框架,从竞争(并且更为成功的)平台中获得了设计约定和最佳实践,并将源代码发布到MVC框架,供开发人员审查。
起初的MVC框架存在的问题
微软在创建MVC框架时,基于现有的http://ASP.NET平台,这是有道理的,因为该平台具有很多固有的底层特性,http://ASP.NET开发人员都熟知和理解这些特性。
但是,将MVC框架移植到最初为http://ASP.NET Web Forms设计的平台上是需要妥协的。MVC框架开发人员逐渐喜欢使用配置设置和代码调整,来禁用或重新配置对Web应用程序没有任何影响但对整个程序正常工作来说必需的特性。
随着MVC框架的普及,微软开始将一些核心功能添加到http://ASP.NET Web Forms中。结果越来越不相匹配,其中需要用来支持MVC框架的独特设计特性被扩展到支持http://ASP.NET Web Forms,却为了让所有的东西融合在一起而让设计变得更加不相匹配。同时,微软开始使用创建Web服务(Web API)和实时通信(SignalR)的新框架来扩展http://ASP.NET。新的框架添加了自己的配置和开发约定,每个都有自己的优点和特异之处,结果导致了零乱的混乱状态。
1.2 http://ASP.NET Core