日期:2010-08-16  浏览次数:20450 次

  网络服务(Web Service)是基于网络的分布式应用程序的基本构造模块,而这些程序是以平台、对象模板和多语言方式构建的。

   网络服务是建立在象HTTP和XML之类的开放的Internet 标准之上的,并且由此形成了可编程网络理念的基础。


   图1 网络服务应用模型

   这篇文章详细讲述网络服务以及为其提供支持的技术,这些技术能确保服务被集成到应用程序里去。同时本文将讲述新的Microsoft.NET框架及其对生成和使用网络服务的支持。

   现在开发中最紧迫的问题是应用程序的集成化:运行在不同操作系统上的不同的应用程序,通常是由不同编程语言对象模板建立的,获取这些程序然后把它们转化为易于使用的网络应用程序。建立在象HTTP和XML之类开放的网络标准之上的网络服务接受了这项挑战。

   但是只支持标准协议是不够的,我们必须有途径来生成、部署、扩展和维护这些网络服务,这正是Microsoft.NET框架要解决的问题。


   图2 Microsoft.NET Framework体系结构

   下面笔者将介绍网络服务及Microsft.NET框架的组件,包括通用运行语言(Common Language Runtime)、服务框架和用于建立、集成网络服务的程序模板。

■网络服务一览
   通常说来,网络服务只是一个作为服务发行的简单应用程序。换句话说,它是可通过URL定位的自动将信息返回到需要它的客户端那里的一种资源。网络服务一个重要的特点是客户不需要知道一种服务是怎样实现的。在本文中,笔者将向你解释网络及网络服务如何把基于组件技术的最好的方面结合在一起,并且介绍与网络服务通信所需的基本框架。

   同组件一样,网络服务提供“黑匣子”函数,它可以被多次用而不用关心此服务是怎样实现的。网络服务还提供被称为契约的精确定义的接口,此接口描绘了所提供的服务。开发人员可以将远程服务、本地服务和定制代码组合在一起集成到应用程序中。例如,某公司可以使用如下服务组建一个在线商店:微软护照(Passport)服务用来验证用户身份、第三方个人化服务用来使网页匹配每一个用户的参数、信用卡处理服务、销售税服务、对每个运输公司的包裹跟踪服务,链接公司内部库存管理程序的内部目录服务以及少量定制代码,以使他们的商店能脱颖而出。图1显示的模型说明了为生成分布式网络应用程序应怎样链接网络服务。

   然而,网络服务与现在的组件技术并不相同,它不使用需要在服务器和客户机有明确的、同类型基本构架的具体对象模型协议,例如DCOM、RMI或IIOP。尽管与具体组件技术紧密结合的实现在一个受控的环境中能很好地被接受,但它们在网络环境中变得不切实际。因为一个集成商业程序的参与者会发生变化,随着时间的推移,技术也在变化,所以在所有参与者间确保一个单一的、统一的体系架构就变得十分困难。网络服务采取了另外一种途径,它使用普便存在的网络协议和数据格式进行通信,如HTTP和XML。支持这些网络标准的任何系统都支持网络服务。

   而且,网络服务契约描述的是以术语报文形式提供的服务,这些服务是由网络服务生成和接受的,而并不描述服务是如何实现的。通过把重点放在报文上,网络服务模板对语言、平台和对象模板变得完全透明。这样,用任何一套编程语言、对象模型和平台的完全特性集,都可实现网络服务。网络服务可以在任何平台上,被任何应用程序所使用。只要用于解释服务容量、报文序列和所期望协议的契约得到认同,那么所实现的网络服务及网络服务用户就可相互不同,而不会影响会话另一端的应用程序。

   网络服务模板对最小体系架构的要求很低,目的是确保网络服务在使用任何技术和编程语言的平台上实现和访问。对网络服务互用性的解决可以只依靠网络标准。然而,为了使应用程序更容易使用网络服务,简单地通过标准网络协议访问网络服务是不够的。当网络服务和网络服务使用者依靠标准的方式(如XML)表示数据和命令、表示网络服务契约、算出网络服务所提供的容量时,网络服务才会更加容易使用。

   XML是定义一个标准的、可扩展的用于提供命令和典型数据的语言的明智选择。虽然为表示命令和典型数据可以定义使用其它技巧(比如编码为一种查询字符串)的规则,但XML被专门设计为描述数据的标准元语言。简单对象存取协议(SOAP)是以一种可扩展的方式使用XML表示数据和命令的工业标准。网络服务可选择用SOAP决定报文的格式。

   XML是网络服务契约的一种常用技术。服务契约语言(SCL)是记录网络服务契约的XML语法。由于SCL是基于XML的,所以对开发者和开发工具来说,它更容易生成并解释契约。


   图3 Services Framework类库

   Disco规范为服务提供者发布网络服务契约和相应的机制描述了一个标准方式,这将使开发者或开发工具可找到契约文献。

   象SOAP、SCL和Disco这样的标准有助于开发者,因为它们不需要明白和实现所使用的每一个网络服务的访问方式。支持这些标准的更好的、已充分测试的、高性能的体系架构将由开发平台提供,这会大大简化整个开发过程。

  ■Microsoft.NET Framework

   Microsoft.NET框架的目的是使你更容易建立网络应用程序和网络服务。图2显示了Microsoft.NET框架的体系结构。建立在操作系统最上层的服务,是管理运行代码需求的Common Language Runtime,这些代码可以用任何现代编程语言所编写。Runtime提供了许多服务,这些服务有助于简化代码开发和应用程序的开发,同时也将提高应用程序的可靠性。.NET Framework包括一套可被开发者用于任何编程语言的类库。在此之上是许多应用程序模板,这些模板为开发网络站点和网络服务提供了高级组件和服务,下面笔者将逐层描述。

  ■Common Language Runtime

   运行语言(Runtime)可以调用并运行任何编程语言所写的代码。以运行为目标的代码被称为受控(Managed)代码,受控代码只是意味着在内部可执行代码与自身代码存在已经定义好的合作契约。对于生成对象、调用方法等这样的任务,被委托给了运行语言,这使得运行语言能为可执行代码增加额外的服务。

   运行语言具有交叉语言集成、自描述组件、简单配制、版本化以及集成安全服务等特点。

   运行语言使用一种能表达大部分现代编程语言语义的通用类型系统,该通用类型系统定义了一套标准类型及生成新标准的规则。运行语言知道怎样生成、执行这些类型。编译器和解释器使用运行语言服务来定义类型、管理对象、进行方法调用。

   类型系统的主要设计目的是使多种语言能深度集成。用一种语言所写的代码能继承用另一种语言所写的类,用一种语言所写的代码抛出的异常能被用另一种语言写的代码所捕获,象调试之类的操作会在完全封闭下进行,而不用考虑代码编写所用的语言。这就意味着编写可重用类库的开发者,不再需要为每一种编程语言或编译器生成一个版本,并且使用类库的开发者也将不再受到他们所使用的编程语言开发库的限制。

   自描述组件简化了开发和配制,并提高了系统的可靠性。许多由运行语言提供的服务是由元数据及用于补充可执行代码的信息所驱动。因为所有的信息都储存在一起,只有可执行的代码才被称为自描述组件。

   自描述组件的一个主要优点是,使用它们并不需要其它文件。类的定义不需要单独的头文件;通过检查元数据对类的定义可以从组件自身获得。跨语言或过程边界访问组件并不需要各自的IDL文件、类型文件或proxy/stubs;