微软基于Web计算的框架结构分析(转载)
一、引言
随着Internet的发展,软件系统已经从客户服务器系统发展到服务器/浏览器系统,但是随着基于Internet应用的深化和基于Web计算的概念的提出,新的计算模型不再是简单的依赖于浏览器作为客户端。
首先,我们来简单看一下计算模型的发展历史,一开始,由于个人计算机还尚未普及,而且计算机价格都比较昂贵,我们一般采用主机模式来进行计算,也就是说客户实际上是通过终端和大型主机进行连接,主机分配一定的CPU时间和磁盘空间给用户,所有用户的计算实际上都是在主机上完成的。这样对主机的要求非常高,要求主机上的操作系统必须是高度可靠、安全的。在这个时候,流行的是IBM的大型机的操作系统,这里注意的是,即使到现在,很多银行依然通过这个模式进行运做,因为容易进行集中管理和维护,客户端实际上仅仅是一个终端的功能,从某一个角度讲就是主机屏幕的延伸。
随着分布式概念的提出和微机功能的增强,软件业又提出了客户/服务器的计算模型,把一些非关键的任务(比如图形界面的显示,数据的显示格式确定,数据的处理等等)放到客户端进行执行,这样相对就减轻了对服务器的负担。但是这种模式一般是基于局域网范围内进行的(比如在九十年代非常流行的一些基于数据库的信息系统就是根据这种模式构建的)。
随着Internet的发展和企业之间电子交互的需求的出现,出现了基于数据库/Web服务器/浏览器这样的计算模型,这种模型实际上是基于全球网络范围内进行的,客户端统一的以浏览器的形式表现给用户,用户通过HTTP协议把任务提交给Web服务器,Web服务器通过和数据库和应用服务器的交互把结果通过HTTP协议传递给客户端,然后客户端再通过浏览器显示结果。在这种模式下的关键是数据传递的安全性和事务性这两个问题,因为HTTP本质是是一个无状态的连接,所以事务处理就变得非常重要,同时因为整个业务是基于全球网络体系结构的,所以安全性也变成一个值得关注的问题。
随着Internet上计算任务的复杂化和业务的多样化,自然而然就产生了以Web为中心进行计算的需求。从本质上说,对Internet应用的复杂化使我们当前的操作系统都显得力不从心,因为我们当前的操作系统一般都是基于单机或者局域网系统的,而如何把操作系统扩展到整个Internet计算这个范畴内,就成了所有操作系统软件生产厂商所必须考虑的问题。
基于Web的软件系统的例子有很多,比如Napster,它允许在用户之间进行磁盘内容的共享,从某一种角度讲,它的基本概念是要建立一个基于Web的文件系统,这个文件系统包含了所有参与者本身的文件系统。这样参与者之间就可以进行文件的共享,通过输入一定的查询条件,我们就可以在其他的用户的存储设备上找到相应的文件并进行下载(当然这种概念在局域网中早就存在,现在Napster把这个概念扩展到了整个Internet领域而已)。
二、Web服务体系结构分析
这种基于Internet类型应用的出现使我们需要一个崭新的框架结构来进行程序的设计,我们需要一个快速和方便的方法进行代码的编写并且能够和Internet上其他的程序进行交互。当然在计算机之间进行数据和信息交互这个概念并不是很新,比如通过RPC,DCOM和CORBA等都可以实现不同计算机上的进程之间的交互。但是它们都有一个致命的缺点:它们需要进行交互的机器具有相似的系统,比如MSMQ只能和MSMQ进行对话,DCOM客户端只能和DCOM服务器端进行交互。
而我们真正需要的是一个通用的开发框架,也就是说不管系统的那一端是什么东西,我们这一端都可以和它进行信息的交互。它的本质意义就是说两端的操作系统不仅可以是异构的(比如一端可以是Windows,另一端可以是UNIX),而且实现的语言也可以是异构的(一端可以用C++实现,另一端可以用VB实现)。
如果大家还记得在DCOM进行交互时的数据列集(Marshal)这个概念的话,那么就可以理解基于Internet异构系统通讯的关键点是什么了。一个就是通讯的标准,两个进程需要采用标准的协议进行通讯,另外一个就是数据的打包,数据应该采用一致的形式进行打包和解包。当前基于Internet最流行的传输协议就是HTTP,所有的Web浏览器都通过这个协议和Web服务器进行通讯并得到相关的网页。而数据的打包也需要采用一定的标准,当前出现的跨平台的信息编码的标准就是XML。因为HTTP和XML都是工业的标准,并不和任何平台,厂商挂钩,所以基于这两种标准构建的系统无疑在任何环境是都是有生命力的。
为了创建一个Web服务,我们所需要做的工作就是编写一个.Net服务对象,使它被异地进程的调用就象能够被本地的客户端直接调用一样。实际上是通过给它标记一定的属性来实现的,使它能够被Web客户端所使用。通过ASP.NET,这个.Net服务对象就能够接受来自客户端的请求(通过HTTP协议传输的)。也就是说.Net服务对象能够和任何使用HTTP和XML标准的进程进行通讯,你也不需要考虑Web通讯的体系结构,操作系统已经帮你搞定了这一切。
从服务对象的角度来讲,一个客户和服务对象之间的通讯可以用下面的形式表示:
1. 从客户端的HTTP请求到达,其中参数可能包含在URL中,也可能包含在一个单独的XML文件中
2. ASP.NET根据.asmx文件的指定创建对象
3. ASP.NET调用对象的某一个特定的方法
4. 对象把结果返回给ASP.NET
在客户端,.NET提供了Proxy类用来快速方便的和服务器提供的Web服务进行交互,通过开发工具得到Web服务的描述,然后就可以产生一个包含一些功能函数的Proxy类,注意,在这里我们可以使用任何类型的语言来开发客户端,当客户端调用其中的某一个函数的时候,Proxy就会产生一个HTTP请求并把它发送给服务器,当服务器响应返回的时候,Proxy能够对结果进行解析并返回给调用该函数的客户端。这样,就保证了客户端能够通过HTTP和XML无缝的和Web服务器进行信息的交互。
从客户端的角度来讲,一个客户和服务对象之间的通讯可以用下面的形式表示:
1. 在运行时刻,客户端产生一个Proxy对象
2. 客户端调用Proxy中的一个方法
3. Proxy把调用转换成HTTP和XML形式,并通过Internet发送到服务器端
4. Proxy通过HTTP协议得到以XML形式表现的结果,并转化成相应的结果值返回给客户
三、Web服务的编写
这里我们可以写一个最简单的Web服务来说明这种新技术的使用,该Web服务以字符串的形式提供当前的服务器的时间(可以精确也可以不精确到秒)。程序是以标准的标记符"<%@...%>"开始的,在该标记符内,WebService告诉ASP.NET该页的代码是作为一个Web服务出现的。Language告诉ASP编译这个页所使用的语言是VB,然后ASP.NET就会使用Visual Basic.NET来进行代码的编译。CLASS属性告诉ASP.NET当前类对象的名称为TimeService。
具体的代码如下:
<%@ WebService Language="VB" Class="TimeService"%>
' 引入名字空间' 需要Web Service
Imports System
Imports System.Web.Services
' 建立一个新的类,该类必须继承系统提供的基类WebService
Public Class TimeService : Inherits WebService
'在类中建立我们所需要的函数,并标记为WebMethods
Public Function <WebMethod()> GetTime (ShowSeconds as Boolean) As String
' 完成该函数的功能:发现当前的时间,格式化,并以字符串形式返回
Dim dt as DateTime
If (ShowSeconds = TRUE) Then
GetTime = dt.Now.ToLongTimeString
Else
GetTime = dt.Now.ToShortTimeString
Endif
End Function
End Class
为了允许开发人员使用Web服务来开发客户端应用,需要在设计和开发的时候给他们提供一定的信息。比如,一个Web服务的客户端需要知道Web服务所暴露的方法和相关的参数以及所支持的协议,这个和一个标准的COM所携带的类型库的概念很类似。但是类型库是CO