65.9K
CodeProject 正在变化。 阅读更多。
Home

关于ASP.NET和AJAX的Web应用程序说明

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (24投票s)

2009年6月20日

CPOL

26分钟阅读

viewsIcon

90969

本文有助于理解ASP.NET和AJAX的Web应用程序的整体编程模型。

引言

当我们开发人员处理Web应用程序时,我们主要关注服务器端、其架构中的N层分层、表示层中的模型-视图-控制器、跨层的数据传输对象、各种设计模式、数据库组织等。然后我们关注客户端或浏览器端,即表示层渲染的地方——CSS、HTML、JavaScript等。在Web应用程序开发过程中,重点主要放在服务器端,偶尔我们也会在JavaScript或CSS中做一些调整,在浏览器屏幕上实现一些呈现行为。如今,微软已经帮助我们在Visual Studio IDE中完成大部分服务器端开发,特别是当我们使用ASP.NET页面中的服务器控件时更是如此。

但有时,检测某些问题需要相当长的时间,因为它需要深入了解Web应用程序上下文中的整体编程模型;这包括万维网基础设施,我称之为基础设施,因为Web应用程序总是假定这个万维网骨干。那么,在现代Web应用程序的上下文中,这个整体编程模型是什么呢?我们将在本文中找到答案。

过去我开始思考这个问题时,偶然发现Sean Ewington(Code Project中的“初学者之路——Web开发”)撰写的一些关于Web开发系列的精彩文章,我清楚地发现该系列文章通过研究Web应用程序开发的几个要素(例如JavaScript、HTML、CSS、ASP.NET及其相关的状态管理技术),采取了一种协同的方法来揭示Web应用程序内部的运行机制。现在,当我们谈论Web应用程序开发时,事情变得更加复杂,因为用户期望值不断提高,技术领域也并非一成不变。它也在根据需求不断演进。例如,如今AJAX已出现在Web应用程序领域,宽带通信技术也已普及。因此,我认为如果能将所有这些技术结合起来,呈现出整个系统如何工作、我们需要满足哪些约束,并最终深入了解ASP.NET开发环境的全貌,那将是一件好事。在本文中,我们将探讨ASP.NET开发中(包括服务器端和客户端,即浏览器端)以及其基础设施(即万维网)所使用的整体编程模型。我确信这一洞察将帮助所有直接使用Microsoft Visual Studio并为ASP.NET Web应用程序设计网页的新开发人员。

桌面应用程序与Web应用程序

为了更好地理解Web应用程序,我们需要将其与桌面应用程序区分开来。这种区分将帮助我们理解Web应用程序中的限制。

桌面应用程序是独立的应用程序,例如Microsoft Word。我们需要将其安装到我们的计算机上。偶尔我们可能会使用互联网下载更新,但运行这些应用程序的代码完全驻留在我们的台式电脑上。

Web应用程序则运行在某个Web服务器上,我们通过互联网上的Web浏览器访问该应用程序。它总是在服务器上更新,当我们通过客户端浏览器使用它时,我们总是会得到更新的版本,例如Google Mail。

在Web应用程序中,存在等待(尽管随着互联网带宽的强大和通过AJAX(稍后描述)进行的异步请求,情况正在发生变化),等待服务器响应,等待通过互联网返回请求的响应,以及等待屏幕刷新浏览器上的页面数据。这种等待被称为请求和响应之间的延迟。

桌面应用程序不需要依赖诸如HTTP(稍后描述)之类的东西,因此应用程序状态可以很容易地管理。此外,独立的桌面应用程序通常会维护与数据库服务器的连接,该数据库服务器可能位于同一台桌面PC上,或者通过局域网(LAN)连接到数据库服务器。

另一方面,在Web应用程序中,用户填写表单字段并点击“提交”按钮。然后,整个表单发送到Web服务器,服务器根据页面的扩展名将处理委托给一个引擎,处理完成后,它会发送回一个全新的页面。这个新页面可能是带有新表单的HTML,其中填充了一些数据,也可能是带有验证结果的页面,或者可能是根据原始表单中输入的数据选择某些选项的页面。当然,当服务器上的脚本或程序正在处理并返回新表单时,用户必须等待。我们的屏幕会变空白,然后随着数据从服务器返回而重新绘制。体验上的差异就在这里。在这里,用户无法像桌面应用程序中通常观察到的那样获得即时反馈。

Ajax试图最大程度地缩小桌面应用程序与Web应用程序之间的交互性(即用户体验)差距。

我们还应该从安全角度注意到另一个明显的区别。在这种情况下,在浏览器上运行的Web应用程序在没有所需权限和特定插件(如Adobe Flash player)的情况下,不应获得直接硬件访问或直接操作系统访问。这在浏览器中称为沙盒安全,它使HTML渲染和JavaScript执行在浏览器内部与客户端操作系统隔离。沙盒是一种通用安全术语,指的是受限权限的应用程序执行环境。此外,同样出于安全原因,浏览器不允许脚本调用位于当前页面域之外的URL,因此存在一些限制。

典型的Web应用程序部署图

以下部署图显示了Web应用程序部署在一个Web服务器和数据库中,两者位于通过局域网连接的单独服务器上。客户端可以通过笔记本电脑、台式机、移动设备等上的浏览器访问这些Web应用程序。在这个简单的图中,请注意客户端平台以及万维网内部(包括通信介质)的技术差异。在这里,万维网不仅是客户端和服务器之外的组件;它还标准化了至少在应用程序层协议(本例中为HTTP)上客户端和服务器之间通过线路传输的内容。

Sample Image - maximum width is 600 pixels

REST架构模型

现在让我们来看看万维网基础设施。当我们谈论Web应用程序的万维网(WWW)基础设施时,最引人注目的模型就是REST。Roy T. Fielding在他的伟大博士论文(论文)中详细解释了这一点,他在其中提出了万维网的架构模型。

在他的论文中,他提到万维网确实非常庞大,其规模超乎想象。它已经遍及世界各地,渗透到每个角落(我认为它仅次于物理学中的“以太”——无线电通信中“不可思议的弹性介质”)。之所以能够发挥出如此巨大的潜力,仅仅是因为普遍的电子通信方法和标准的命名系统。万维网还面临着诸多限制,以确保可扩展性。Roy将这些要求转化为他的架构风格,即表征性状态传输(REST)。

在 REST 中,最重要的元素是资源。REST 中的资源由 URL(他称之为 URI)标识,它可以是一个应用程序,例如 bookcrossing。一个资源可以是一个 Word 文档、一个 PDF 文档、一个 HTML 文档、一个 ASP.NET 页面、一个图像等。

REST模型的一个关键特点是其成员组件之间的松耦合。REST定义了其成员组件之间的无状态协作。Roy解释说,这个约束是必须的,因为在大规模电子网络上通信时,我们不应该把某些事情视为理所当然。通常,请求和响应之间的时间相对较长,服务器可能会重新启动,客户端可能会在对话中断开。服务器跟踪所有这些状态极其困难,而且当我们考虑万维网上的互联网连接规模时,绝对不具备可扩展性。

因此,根据这项标准化,REST 模型中的每个请求都应该是自包含的。这样,服务器就不需要知道请求来自哪里、客户端是谁以及他/她之前的请求是什么。它们所做的只是响应传入的请求,而不保持任何状态连续性。

万维网的另一个特点(因为它由大型电子网络组成,例如无线通信、光纤和老式的拨号连接等等)是技术变化迅速,因此万维网能够独立于底层细节工作至关重要。

REST 是分层的。在分层系统中,每个组件层的行为使得每个层组件都无法“看到”与其交互的直接层之外的任何东西。在 REST 中,分层通过封装促进了独立性。

在REST术语中,一个运行在WWW上的精心设计的Web应用程序应该表现为一个网页网络(一个虚拟状态机),用户通过选择链接(状态转换)在应用程序中前进,从而将下一个页面(代表应用程序的下一个状态)传输给用户并渲染供其使用。

正如在“万维网中的REST”中所解释的,组件接口被设计成对大粒度超媒体数据传输高效,这种传输方式简单但并非最优,尤其是在将其应用于交互式Web应用程序时。

在 REST 中,架构师通过向接收者发送原始数据以及描述数据类型的元数据来利用这一选项,以便接收者(在 Web 应用程序中通常是浏览器)可以选择自己的渲染引擎。

REST 模型中的另一个约束来自按需代码的风格。REST 允许通过下载和执行脚本形式的代码来扩展客户端功能。由于脚本 (JavaScript) 是文本形式,因此可见性不会受损(想想不同的客户端平台,例如 Windows、Linux、Mac 等,想想防火墙用于安全)。另请注意,这部分,即文本/HTML/JavaScript 是在浏览器环境中执行之前进行解释的,而不是编译的。

在REST架构中,主要的连接器类型是客户端和服务器。两者之间的本质区别在于,客户端通过发出请求来发起通信,而服务器则监听连接请求并通过打开端口来响应,从而提供对其服务的访问。

用户代理使用客户端连接器发起请求,并成为响应的最终接收者。最常见的例子是Web浏览器,它提供对服务器提供的信息服务的访问,并根据应用程序需求渲染服务响应。

Web服务器使用服务器连接器来服务请求的资源。

下图(取自博士论文)展示了当Web应用程序运行时,基于REST的WWW的流程视图架构。

Sample Image - maximum width is 600 pixels

有三种不同的场景:a、b和c。

在所有这些情况下,客户端请求都未被用户代理的客户端连接器缓存满足,因此每个请求都已根据每个资源标识符的属性和客户端连接器的配置路由到资源源。

请求 (a) 已发送到本地代理,该代理反过来访问通过 DNS 查找发现的缓存网关,该网关将请求转发给原始服务器以满足请求。

请求(b)直接发送到原始服务器,该服务器能够从自己的缓存中满足请求。

请求 (c) 发送到一个代理,该代理能够直接访问 WAIS,WAIS 是一个独立于 Web 架构的信息服务,并将 WAIS 响应转换为通用连接器接口可识别的格式。

对于基于网络的应用程序,系统性能主要由网络通信决定。对于分布式超媒体系统(WWW上最初的目标应用程序),组件交互由大粒度数据传输组成,而不是计算密集型任务。WWW的REST模型正是为满足这些需求而开发的。它专注于资源的通用连接器接口和表示,使得中间处理、缓存和组件的可替换性成为可能。这反过来又使得WWW上的Web应用程序从1994年每天10万个请求扩展到1999年每天6亿个请求,并且仍在增长(有人能说它今天达到了什么程度吗?)。

ASP.NET

现在,让我们在上述Web应用程序的上下文中看看ASP.NET。借助Microsoft ASP.NET技术,ASP.NET文件只是文本文件,放置在Web服务器(Microsoft IIS)中,请求URL(在浏览器中输入或键入的资源链接)指向这些文件。它们就像REST中描绘的任何其他资源文件一样。当ASP.NET页面的请求到来时,服务器将定位请求的文件,并要求ASP.NET引擎处理该请求。ASP.NET引擎将处理服务器标签并生成HTML,然后返回给客户端。

AJAX

现在我们来看看AJAX在架构模型方面带来了哪些变化。下图显示了经典Web应用程序和AJAX应用程序之间的区别。请注意,图中显示的XML数据可以是任何基于文本的数据,例如Microsoft JSON。

AJAX 应用程序使用大量小数据请求,而不是重新请求整个页面。这使得 AJAX 应用程序响应更迅速,因为客户端和服务器之间只需传输新的增量数据。批评 AJAX 的人说它需要更多带宽,但事实并非如此。让我解释一下,请记住即时设计原则,即当页面打开时,用户可能对整个页面数据不感兴趣,而他的兴趣是局部的,用户界面在设计时考虑到了这一点(特定的树节点、窗口中的面板等)——因此在这种情况下,我们可以最初用最佳信息填充页面,然后让用户按需获取更多信息。

Sample Image - maximum width is 600 pixels

注意——此图摘自Mike Arthur的“让Dizzy与Ajax一起闪耀”项目报告,该图版权归Adaptive Path, LLC 2005所有。)

经典浪潮与 AJAX 应用程序中的客户端服务器交互

Sample Image - maximum width is 600 pixels

注意——此图摘自Mike Arthur的“让Dizzy与Ajax一起闪耀”项目报告,该图版权归Adaptive Path, LLC 2005所有)

如图所示,理论上客户端和服务器之间可以有任意数量的异步连接,这些连接可以重叠,但浏览器会施加限制。例如,Internet Explorer 允许与任何服务器同时工作最多 2 个连接。

根据微软的说法,Internet Explorer 遵循 RFC2616,其中规定:“使用持久连接的客户端应限制其与给定服务器维护的同时连接数。单用户客户端不应与任何服务器或代理维护超过 2 个连接。”

ASP.NET Web 应用程序运行时

Sample Image - maximum width is 600 pixels

Sample Image - maximum width is 600 pixels

在这个简化视图中(不涉及IIS架构、Internet Explorer(浏览器)架构、TCP通信堆栈等细节),左侧是服务器端,右侧是客户端,它们通过由万维网基础设施标准管辖的互联网连接,因此HTTP是客户端和服务器之间的应用层协议。上图演示了经典的ASP.NET和带有局部渲染的ASP.NET AJAX。我们可以进一步扩展我们的可视化,将左右两端都视为面向对象范式(OOP)中的面向对象世界——对象在每次客户端服务器交互期间都被序列化和反序列化,并且只有文本/HTML/JavaScript流通过互联网管道传输。或者,如果我们将基于消息的交互方式感到满意,那么我们可以想象客户端和服务器通过HTTP线路连接,并以JSON/XML作为交换的消息。

这里,客户端和服务器都提供事件驱动的编程环境。开发人员需要拦截服务器端和/或客户端事件,以进行自定义编码,实现自定义行为或操作。

客户端编程模型

让我们先来看看客户端。当我们考虑浏览器上的Web应用程序时,会遇到两种类型的对象模型

  1. 浏览器对象模型(BOM)——例如Windows - 框架等。这些是由运行在客户端操作系统上的浏览器应用程序提供的对象。这里需要理解的重要一点是,它们是HTML文档中DOM元素的容器。
  2. 文档对象模型(DOM)——它建模了HTML文档中的文档及其元素。这正是服务器根据客户端请求的URL返回的响应。请注意,正是这个文档通过互联网传输(当然,在序列化为文本流之后)。

因此,表示 HTML 文档的 DOM 是动态的;它在客户端和服务器之间的网页往返过程中不断变化。内容会变化,颜色会变化;其他属性也会变化,例如选择变化——某些控件可能会消失,某些新控件会被添加,等等,这些都基于用户与页面的交互。当我们将这些行为变化与服务器行程(例如在回发期间,请求和响应发生在同一个页面上)结合起来时,我们可以想象 DOM 对象被序列化为文本流,并通过客户端和服务器之间的互联网管道双向传输。收到响应后,客户端浏览器再次反序列化并重建 DOM 以进行新的呈现和进一步操作。

由于历史原因,浏览器编程环境是JavaScript,它始于Netscape浏览器,然后作为标准,所有浏览器都内置了JavaScript解释器。

JavaScript 主要用于在 HTML 页面中嵌入函数,将用户的操作与页面中的 DOM 元素连接起来。在使用客户端事件访问 DOM 元素时,由于 DOM 的动态特性,我们需要小心。如果我们不小心,可能会在某些事件处理程序(例如“onload”)中遇到 JavaScript 的“Object expected”错误,而相同的 DOM 元素在“onclick”事件处理程序中却能正常工作并且有效。由于解释的自上而下性质,在加载时将 JavaScript 方法放置在何处也很重要,是在表单开头(DOM 尚未构建)还是在表单末尾(DOM 已构建)。

根据万维网(WWW)要求和REST模型中定义的约束,服务器端和客户端应用程序之间没有像远程过程调用(RPC)那样的直接接口——这里唯一的共同点是流经互联网的文本流。这个文本流包含数据(以HTML形式)和程序(即JavaScript)。

使用JavaScript,我们可以通过编程方式重命名、编辑、添加或删除显示文档中的元素,并主要使用文档对象模型(DOM)处理这些元素触发的任何事件。此外,我们可以执行任何特定于浏览器的操作,例如打开或弹出新窗口,或者——这使得AJAX如此特别——调用流行的XMLHttpRequest对象,并对Web服务器上的远程URL进行异步调用。

虽然 JavaScript 是一种强大的语言,但将复杂的应用程序逻辑放在客户端可能会花费大量时间和精力。ASP.NET AJAX 允许我们将部分应用程序处理移至客户端,同时通过局部页面渲染,我们可以使用服务器端事件模型并影响客户端浏览器上的页面行为变化。

服务器端编程模型

当请求到达 Web 服务器请求 ASP.NET 页面时,运行时会创建页面代码隐藏类的实例,并调用其 ProcessRequest 方法,该方法启动服务器端 ASP.NET 页面生命周期,并最终生成页面内容,然后以文本/HTML/JavaScript 形式返回给客户端。

当我们将AJAX与ASP.NET编程模型结合时,会发现有两种变体:局部渲染和远程服务调用。

AJAX 的局部渲染遵循经典 ASP.NET 2.0 应用程序的模型。在此基础上,它提供了一组新的服务器端控件,如更新面板,我们可以使用它们来实现无闪烁的页面更新。

另一方面,远程服务涉及面向服务的方法,其中后端服务由AJAX前端调用。后一种方法比第一种(即局部渲染模型)提供更完整、更流畅的用户体验。

从架构角度来看,局部渲染并没有增加任何新内容。它增强了现有的 ASP.NET 应用程序的一些 AJAX 功能——其中最重要的是无闪烁的页面更新。

局部渲染请求通常被称为 AJAX 回发。AJAX 回发类似于经典的 ASP.NET 回发,不同之处在于页面 URL 是由客户端 ASP.NET AJAX 库中定义的一段脚本代码(如图中所示的 AJAX 引擎)调用的。

一旦到达服务器,请求会经历回发请求的典型生命周期,并触发 Init、Load 和 Pre-Render 等事件。在服务器端,AJAX 回发与经典 ASP.NET 回发的主要区别在于它用于渲染最终标记的算法。这种不同的算法是性能提升和页面无闪烁的关键。

请注意,闪烁的根源在于请求和响应之间的延迟。如果此延迟超过 20 毫秒,人眼就可以检测到变化。AJAX 通过使用异步请求和响应来消除这种延迟,而用户不会察觉到这一点。此外,由于每次只更改文档的一部分,因此客户端在每次交互期间涉及的本地处理也显着减少,从而实现了更平滑的屏幕过渡和丰富的用户体验。

ASP.NET AJAX 中的客户端和服务器端组件

Sample Image - maximum width is 600 pixels

ASP.NET 接收一组包含代码和标记的文件,并生成一个 Page 类,该类随后被编译和缓存。

对于对页面的每个请求,都会实例化该类,并遵循完整的页面生命周期,并在服务器上执行一组事件。其中一些事件通常会被我们在生成的页面类中通过编码进行重写,以实现自定义操作和行为。页面中的控件也参与生命周期,与后端数据库进行数据绑定,响应用户输入,并处理用户先前视图中其状态的变化。

例如,按钮控件会公开一个单击事件。使用它时,我们无需编写代码来检查页面上的所有表单变量以了解按钮是否被单击。相反,我们只需为该“button_Click”事件处理程序提供代码。然后,事件处理程序代码可以更新页面的 HTML 或页面上其他控件的属性和数据。

ASP.NET AJAX 页面必须包含一个 ScriptManager 控件的实例。此控件是 ASP.NET AJAX 页面的真正神经中枢。它负责将页面链接到任何所需的框架脚本文件,并在检测到 AJAX 回发时协调局部渲染。ScriptManager 控件检查请求中的 HTTP 头,以确定请求是否为 AJAX 回发。当我们谈论 Microsoft AJAX 库时,涉及两个主要文件:MicrosoftAjax.jsMicrosoftAjaxWebForms.js

MicrosoftAjax.js 定义了 Microsoft AJAX 库支持的语言扩展,包括命名空间、接口、枚举和继承。MicrosoftAjaxWebForms.js 定义了局部渲染引擎和整个通信网络堆栈。

在 ASP.NET AJAX 应用程序中,我们不需要直接引用或嵌入这两个文件中的任何一个。这是 ScriptManager 的任务之一,它管理正确 JavaScript 文件和客户端数据的下载,包括 AJAX 库、远程服务的代理类、脚本文件的本地化版本和全局化数据。

讨论中使用的几个术语

HTTP

超文本传输协议(HTTP)是一种应用层协议,用于“万维网(WWW)”中。它是一种请求/响应式协议。客户端(浏览器)向服务器(Web服务器)发出请求,服务器响应这些请求。HTTP 使用 TCP/IP 协议进行通信。它连接到服务器的特定端口(默认是80),并通过该端口进行通信。一旦完全收到响应,客户端程序将与服务器断开连接。对于每个请求,客户端程序都必须与服务器建立连接并再次执行所有请求周期。

在响应消息中,HTTP 包含状态码:100-199 表示消息包含临时信息响应;200-299 表示请求成功;300-399 表示请求需要重定向到另一个资源;400-499 表示客户端犯了不应重复的错误;以及 500-599 表示服务器遇到错误,但客户端以后(或通过其他服务器)可能会得到更好的响应,等等。

在 HTTP 中,请求通过通用接口指向资源,该接口具有标准语义,可由 WWW 中的中介以及提供服务的机器进行解释。其结果是一个基础设施,允许独立于信息来源的分层转换和间接,这有助于实现互联网规模、多供应商、可扩展的信息系统。为了理解 HTTP,让我们尝试将一个现实场景转换为 HTTP。考虑以下示例(摘自 Alan Trick 的“An Overview of REST”):

请求:从杂货店买牛奶。我要1%的,但2%的也可以接受。

回复:好的,这是1%的牛奶:

[牛奶内容]

在 HTTP 头部语言中,请求可能看起来像这样

GET /milk HTTP/1.1
Host: grocery-store
Connection: close
Accept: example/milk-1p,example/milk-2p;q=0.5

以及回应

HTTP/1.1 200 OK
Content-Type: example/milk-1p
Connection: close
[Contents of the milk]

HTTP中的资源是名词;HTTP中的动词是方法。两个常用的方法是GETPOST

在上面的例子中,有两部分元数据。第一个在请求中:请求要求1%或2%的牛奶,尽管1%的牛奶更受偏爱。请注意,这些值对应于媒体类型(或MIME类型);这里特定的值并非真正的媒体类型,而是保留用于示例的值。响应中包含一条声明,表示正在发送1%的牛奶。

网页上的“内容”通常是HTML页面或其他电子格式,例如GIF图像。它也可能包含指向Web上其他资源的链接。

尽管早期的基于 HTTP 的每连接单请求/响应行为使得实现变得简单,但由于每次交互设置成本的开销,导致底层 TCP 传输的利用效率低下。

为了解决这个问题,Web架构师采用了持久连接的形式,它使用长度分隔的消息,以便在单个连接上发送多个HTTP消息。对于HTTP/1.0,这是通过连接头部字段中的“keep-alive”指令实现的。HTTP/1.1最终将持久连接设为默认,从而通过HTTP-version值表明其存在,并且仅使用连接指令“close”来更改默认值。

Proxy

如REST图所示,代理位于客户端和服务器之间。客户端连接到代理,请求一些服务,例如文件、连接、网页或其他资源,这些资源可从不同的服务器获取。代理根据其过滤规则评估请求。如果请求通过过滤器验证,代理通过连接到相关服务器并代表客户端请求服务来提供资源。缓存代理保留经常请求的资源的本地副本,允许大型组织显著减少其上游带宽使用和成本,同时显著提高性能。

网关

网关是充当另一个网络入口的网络点。在互联网上,一个节点或停止点可以是网关节点或主机(端点)节点。互联网用户和为用户提供页面的计算机都是主机节点,而连接中间网络的节点是网关。例如,控制公司网络之间流量的计算机或互联网服务提供商(ISP)用于将用户连接到互联网的计算机是网关节点。

在 IP 网络上,客户端应自动将目标位于给定子网掩码之外的 IP 数据包发送到网络网关。子网掩码定义了网络的 IP 范围。例如,如果一个网络的基 IP 地址为 192.168.0.0,子网掩码为 255.255.255.0,那么任何发送到 192.168.0.X 之外的 IP 地址的数据都将发送到该网络的网关。在 Windows 计算机上,通过共享该桌面上的互联网连接来实现此网关功能。

DNS

域名系统(DNS)是互联网中计算机、服务或任何资源的层次化命名系统。它将各种信息与分配给每个参与者的域名关联起来。最重要的是,它将对人类有意义的域名转换为与网络设备相关的数字(二进制)标识符,以便在全球范围内定位和寻址这些设备。解释域名系统的一个常用类比是,它充当互联网的“电话簿”,将人类友好的计算机主机名转换为IP地址。例如,www.example.com 转换为 208.77.188.166。

AJAX

Ajax 是 Asynchronous JavaScript and XML 的缩写。本文中讨论的 AJAX 更侧重于用户体验,即应用程序对用户操作的响应能力,它由 HTML、JavaScript 技术、DHTML 和 DOM 组成。

JSON

JavaScript 对象表示法 (JSON) 以其最简单的形式允许我们将 JavaScript 对象中表示的一组数据转换为 string。它在表示上比 XML 更紧凑。

回发

回发是Web应用程序客户端(浏览器)和服务器端(IIS)之间的一种通信机制。通过回发,页面/表单的所有内容都从客户端发送到服务器进行处理,并且在遵循页面生命周期后,所有服务器端内容都将被渲染,客户端(浏览器)显示该内容。它也被称为页面的往返。

结论

理解使用REST模型的底层万维网基础设施的架构原则,有助于我们理解有无AJAX的ASP.NET Web应用程序所面临的约束。结合微软客户端和服务器端事件模型,我们就能完整地理解(至少在概念上)正在发生的一切。请注意,基于ASP.NET AJAX的Web应用程序本身可能并非完全RESTful,目前正在这方面进行各种努力,但这些讨论不是本文的主题。

根据您对本文的反馈,我计划撰写续篇,其中我将通过一个ASP.NET项目示例,演示服务器端代码基于某个事件的变化如何通过网络传输并影响客户端行为的变化。届时,我将使用微软免费提供的辅助工具“Fiddler”。感谢您阅读本文。请发送您的反馈。

参考文献

  1. 现代 Web 架构的原理设计 () – Roy T Fielding, Richard N Taylor
  2. REST 概述 – Alan Trick
  3. IBM 的 AJAX 精通系列 – Brett McLaughlin
  4. AJAX 应用程序架构 – Dino Esposito
  5. 初学者之路——Web 开发——Sean Ewington

历史

  • 初始版本于2009年6月19日提交
© . All rights reserved.