2002-09-17 10:32
网络服务提供了建立 Microsoft .NET 的基本模块
本文假定你已经熟悉了HTTP与XML
本文难度等级: 2
概要:网络服务是基于网络的分布式应用程序的基本构造模块,而这些程序是以平台、对象模板和多语言方式构建的。网络 服务建立在象HTTP和XML之类的开放的Internet 标准之上的,并且形成了微软的可编程网络理念的基础。
这篇文章详细讲述了网络服务以及为其提供保证的技术,这些技术能确保服务被集成到应用程序里去。接下来叙述了新的Microsoft .NET框架及它对生成和使用网络服务的支持。
现在最紧迫的挑战是应用程序的集成化:获取运行在不同操作系统上的不同的应用程序――它们是由使用不同编程语言的对象模板建立的,然后把它们转化为易于使用的网络应用程序。建立在象HTTP和XML之类开放的网络标准之上的网络服务接受了这项挑战。
但是只支持标准协议是不够的,必须有途径来生成、部署、扩展和维护这些网络服务,这正是Microsoft? .NET框架要解决的问题。
本文描述了网络服务及Microsft .NET框架 的组件,包括通用运行语言(common language runtime),服务框架和用于建立、集成网络服务的程序模板。
网络服务一览
通常说来,一个网络服务只是一个作为服务――通过Internet标准此服务能与其它网络服务集成在一起――发行的简单的应用程序。换句话说,它是可通过URL定位的自动将信息返回到需要它的客户端那里的一种资源。网络服务一个重要的特点是客户不需要知道一种服务是怎样实现的。在本节中,我将向你解释网络及网络服务如何把基于组件技术的最好的方面结合在一起的,并且介绍与网络服务通信所需的基本框架。
同组件一样,网络服务提供“黑匣子”函数,它可以被再次作用而不用关心此服务是怎样实现的。网络服务提供被称为契约的精确定义的接口,此接口描绘了所提供的服务。开发人员可以将远程服务、本地服务和定置代码组合在一起而集成应用程序。例如,某公司可以使用如下服务组建一在线商店:微软护照(原文:Passport)服务以验证用户身份,第三方个人化服务以使网页匹配每一个用户的参数,信用卡处理服务,销售税服务,对每个运输公司的包裹跟踪服务,链接公司内部库存管理程序的内部目录服务,以及少量定置代码以使他们的商店能脱颖而出。
然而,网络服务与现在的组件技术不同,它不使用需要在服务器和客户机有明确的、同类型基本构架的具体的对象模型协议,例如DCOM、 RMI或 IIOP 。尽管与具体组件技术紧密结合的实现在一个受控的环境中能很好地被接受,但它们在网络环境中变得不切实际。因为一个集成商业程序的参与者会发生变化,随着时间的推移,技术也在变化,所以在所有参与者间确保一个单一的、统一的体系架构就变得十分困难。网络服务采取了另外一种途径,它使用普便存在的网络协议和数据格式,如HTTP和XML,进行通信。支持这些网络标准的任何系统都支持网络服务。
而且,网络服务契约描述的是以术语报文形式提供的服务,这些服务是由网络服务生成和接受的,而不是描述服务是如何实现的。通过把重点放在报文上,网络服务模板就完全对语言、平台和对象模板一无所知。 用任何一套编程语言、对象模型和平台的完全特性集,都可实现网络服务。网络 服务可在任何平台被用任何语言所实现的应用程序使用。只要用于解释服务容量、报文序列和所期望协议的契约得到认同,那么所实现的网络服务及网络服务用户就可相互不同,而不会影响会话另一端的应用程序。
网络服务模板对最小体系架构的要求很低,以确保网络服务在使用任何技术和编程语言的平台上实现和访问。对网络服务互用性的解决可只依靠网络标准。然而,为了使应用程序更容易使用网络服务,简单地同意通过标准网络协议就可以访问网络服务是不够的。当网络服务和网络服使用者依靠标准的方式表示数据和命令、表示网络服务契约 、算出网络服务所提供的容量时,网络服务才容易使用。
XML是定义一个标准的、可扩展的用于提供命令和典型数据的语言明显的一种选择。虽然为表示命令和典型数据可以定义使用其它技巧(比如编码为一种查询字符串)的规则,但XML被专门设计为描述数据的标准元语言。简单对象存取协议(SOAP)是以一种可扩展的方式使用XML表示数据和命令的工业标准。网络服务可选择用SOAP决定报文的格式。从发表在2000年8月那期《MSDN Magazine》上的Rob Caron的文章中,你可以学到更多有关SOAP和SOAP Toolkit for Visual Studio? 6.0 的知识(见“开发网络服务:与Visual Studio开发的SOAP Toolkit运行”)。
XML是网络服务契约的一种使能技术。服务契约语言 (SCL)是记录网络服务契约的XML语法。由于SCL是基于XML的,所以对开发者和开发工具来说,容易生成、解释契约。关于SCL细则的草案很快会出台(注意:现在的SOAP Toolkit for Visual Studio 6.0支持称为SDL的SCL的早期版本)。
Disco 规范为服务提供者发布网络 服务契约和相应的机制描述了一个标准方式,这将使开发者或开发工具可找到契约文献。当你读到这里时, Disco规范的草案应出台了。
象SOAP, SCL和Disco这样的标准有助于开发者,因为它们不需要明白和实现所使用的每一个网络服务的访问方式。支持这些标准的更好的、已充分测试的、高性能的体系架构将由开发平台提供,这会大大简化整个开发过程。
Microsoft .NET Framework
Microsoft .NET框架的目的是使你更容易建立网络应用程序和网络服务。建立在操作系统最上层的服务,是管理运行时代码需求的common language runtime,这些代码可以用任何现代编程语言所写。Runtime提供了许多服务,这些服务有助于简化代码开发和应用程序的开发同时也将提高应用程序的可靠性。.NET Framework包括一套可被开发者用于任何编程语言的类库。在此之上是许多应用程序模板,这些模板特定地为开发网络站点和网络服务提供高级组件和服务。下面我将一层层地描述。
Common Language Runtime
运行语言(runtime)调入并运行用任何运行感知编程语言所写的代码。以运行为目标的代码被称为受控(managed )代码,受控代码代码只是意味着在内部可执行代码与运行自身间存在已定义好的合作契约。对于象生成对象、调用方法等这样的任务,被委托给了运行语言,这使得在运行语言能为可执行代码增加额外的服务。
运行语言以交叉语言集成、自描述组件、简单配制和版本化及集成安全服务为特点。下面将快速查看一下每一特点。
运行语言使用一种新的能表达大部分现代编程语言语义的通用类型系统,通用类型系统定义了一套标准类型及生成新标准的规则。运行语言知道怎样生成、执行这些类型。编译器和解释器使用运行语言服务定义类型、管理对象、进行方法调用,而不是使用工具或特定于语言的方法。
类型系统的主要设计目的是使多种语言能深度集成。用一种语言所写的代码能继承用另一种语言所写的类的实现,用一种语言所写的代码抛出的异常能被用另一种语言写的代码捕获,象调试和剖析之类的操作会在完全封闭下工作,而不用考虑代码所用的语言。这就意味着编写可重用类库的开发者,不再需要为每一种编程语言或编译器生成一个版本,并且使用类库的开发者不再受到为他们使用的编程语言开发的库的限制。
自描述组件――现在Microsoft .NET框架上已成为可能――简化了开发和配制,并提高了系统的可靠性。我解释一下它是怎样工作的。许多由运行语言提供的服务是由元数据及用于补充可执行代码的信息所驱动。因为所有的信息都储存在一起,只有可执行的(代码)才被称为自描述组件。
自描述组件的一个主要优点是,使用它们并不需要其它文件。类的定义不需要单独的头文件;通过检查元数据对类的定义可以从组件自身获得。跨语言或过程边界访问组件并不需要各自的IDL文件、类型文件或proxy/stubs;所必需的信息已存在于元数据之中。为识别开发者请示的服务属性,并不需要展开各自的配制信息。 最主要的是,由于元数据是在编译过程中由源代码生成,并与可执行代码储存在一起,它将永远和可执行部分同步。
除了改善对单个组件的配制,Microsft .NET框架定义了一个应用程序配制模板,以解决定置应用程序安装和DLL版本化(通常被称为“DLL Hell”)这一复杂过程的问题,运行语言提供了支持这个模板的服务。
Microsft .NET框架 引入了组合体的概念。一个组合体是一组资源和类型,并包括有关这些资源和类型的元数据,也就是被作为一个单元配制的。元数据被称为组合体的名单,它包含象类型和资源表之类能被组合体外看得见的信息,这个名单也包括有关从属关系之类的信息,例如组合体建立时的版本号。开发人员可以指定版本策略,以指示运行语言是否装入系统上已安装的依赖于组合体的最新版本,装入一指定版本,或在编译时使用的版本。
某软件组件的多个拷贝总可以存在于同样的操作系统上,然而,通常说来,只有其中的一个拷贝能被操作系统注册、调入内存、执行。对系统来说,定位和调入内存的策略是全局性。.NET Framework common language runtime 增加了所必须的体系架构以支持管理组件定位和调入的每个应用程序策略,这通常被称为并行配制。
组合体可以被一个应用程序私有,或被多个应用程序共享。一个组合体的多个版本可以同时配制在同一台机器上。应用程序配制信息定义了到何处去查找组合体,这样runtime就能为同时运行的两个不同的应用程序装入同一组合体的不同版本。这就消除了由组件版本的不兼容性引起的问题,提高了系统整体的稳定性。如果必要,如果必要,管理员可以为配制时刻的组合体增加配制信息,例如一个不同的版本策略,但是编译时提供的原始信息永远不会丢失。
因为组合体是自描述的,所以并不需要在系统上进行显式注册。应用程序的配制简单到只需将文件拷贝到目录中既可(如果为了使应用程序能够运行,必须安装未经组织过的组件的话,情况会稍微复杂一点)。配制信息保存在可被任何文本编辑器编辑的XML文件中。
最后,运行语言也提供完整的、普遍深入的安全服务,以确保未经授权的用户不能访问机器上的资源,并且代码不会执行未经允许的动作。这就提高了系统整体的安全性可靠性。 由于运行语言用于装入代码、生成对象、执行方法调用,所以当受控代码装入内存、执行时,运行语言能进行安全检查,强化安全策略。
Microsft .NET框架不仅规定代码访问安全,还规定基于角色的安全。通过代码访问安全机制,开发人员能为应用程序指定完成工作所必需的权限。例如,代码或许需要写文件或访问环境变量的权力。这类信息和有关代码标志的信息一起存储在配制级上的。当代码装入内存及执行方法调用时,运行语言验证是否能给予代码所要求的权限。如果不能,将记录一条安全冲突信息。给予权限的策略,这被称为信任策略,是由系统管理员建立的,并且是建立在关于代码的证据基础之上,比如:代码是谁发布的,是从什么地方获得的,以及在组合体中找到的代码标志和它要求的权限。开发人员可以指定他们显然不需要的权限,以防止其它人恶意使用他们的代码。如果所需要的权限依赖直到运行时刻才会知道的信息,那么就可写入纲邻性的安全检查。
除了代码访问安全,运行语言还支持基于角色的安全。基于角色的安全建立同代码访问安全一样的权限模板,只是这些权限是建立在用户的身份之上,而不是建立在代码的标志之上。角色表明了用户所属的类,并且可以在开发和配制阶段定义。给予权限的策略被分配到每个预定义的角色。在运行时刻,用户的身份被确定,代码将代表这个身份运行。运行语言决定用户是哪个角色的成员,然后给予基于这个角色的权限。
在查看Microsft .NET框架的可编程模板前,先看一下它所提供的服务。
服务框架
在common language runtime之上是服务框架,此框架提供能被任何现代编程语言调用的类。所有的类都遵循一套命名和设计方针,以大大减小开发人员的学习上的弯路。
框架包括一套开发人员希望在标准语言库中存在的基类库,例如:集合、输入/输出,字符串及数据类。另外,基类库提供访问操作系统服务如图画、网络、线程、全球化和加密的类。服务框架也包括数据访问类库,及开发工具,如调试和剖析服务,能够使用的类。本文章没有详细讨论所有的类,我将重点放在数据访问类上,因为大多数网络服务需要对数据的访问。当然,你可以在Microsoft .NET Framework SDK中找到关于服务框架类库的附加信息。
数据访问服务
几乎所有的网络服务都需要查询和更新永久性数据,不论是以简单文件,还是以相关数据库,或是以其它的存储类型存在。为了提供对数据的访问,服务框架包括ActiveX? Data Objects+ (ADO+)类库。如同名子所暗示地那样,ADO+由ADO发展而来。ADO+被设计为基于网络的可扩展的应用程序和服务提供数据访问服务。ADO+为连接的指针风格的数据访问,同时也为更适合于把数据返回到客户端应用程序的无连接的数据模板提供高性能的APIs流,就象在以后介绍的那样。图4 阐明了ADO+的体系结构,表明任何数据,不论这些数据实际上如何存储的,都以XML或相关数据的格式被操作,不论是哪一种格式,在一个给定的时间点上对应用程序都是最合适的。
就象其余几个部分一样,ADO+定义了那些链接数据仓库、 对数据仓库发送命令及从中获取结果的类。这些类由受控数据提供者(managed data
provider)实现。ADO+中链接和命令对象看上去和ADO中的是一样的,并且一个名为DataReader的新类提供了通过高性能A
表单应用模板
从概念上讲,在服务框架的最上面是两个应用程序模板:Windows?应用程序模板和网络应用程序模板。尽管我把重点放在把微软.NET 框架用作开发网络服务和网络应用程序的一种途径上,但框架也可用于开发较传统的基于Windows的应用程序(当然,这些应用程序也能使用网络服务)。
编写Windows客户应用程序的开发人员可使用Win表单应用程序模板以利用Windows丰富的用户接口特点,包括现在的ActiveX控件和Windows 2000的新特点,如透明的、分层的、浮动窗口。可以选择传统的Windows或网络外观。得知它和现在的基于Windows表单包的相似性以后,开发人员会发现Win表单可编程模板和对设计阶段的支持非常直观。
Win 表单利用了Microsft .NET框架 runtime以减少基于Windows的客户应用程序的开销。只要应用程序和组件是用Win所写或被Win表单应用程序使用,那么它们就能被框架安全模板在客户机上安全地执行。如果以这种方式使用或执行,那么某人从Internet下载下来的生猛游戏就不会对配制信息和数据产生破坏,否则会自动地给用户地址薄里的每一个人发送电子邮件。
Microsft .NET框架 装配模板简化了应用程序的配制和版本化 。应用程序可被配制为使用它们在编译和测试所用的共享组件,而不是使用恰好在客户机器上安装的随便什么版本的组件,这就提高了应用程序的可靠性,减少了应用程序所支持调用的主要因素:用户接口控件和其它共享组件版本的不兼容性。
结论
网络服务为在Internet上绑定应用程序提供了一个利用现存体系架构和应用程序的简单的、灵活的、基于许多标准的模型。网络应用程序很容易与当地开发的服务或已存在的服务集成在一起,而不用考虑开发平台、开发语言或使用的对象模型,以用于实现任何组成的服务或应用程序。
Microsft .NET框架在现有开发人员技巧之上,提供了一个应用程序模板和关键技术,用于简化安全、可靠、可扩展、高可用性的网络服务的建立、部署和不断的发展。