浅谈及实战Web Service

** 简要介绍下SOA及个人对WebService的理解.就一个具体的项目介绍下实施过程中一些需要注意的问题 **

**
引用文章:
(1) http://webservices.xml.com/pub/a/ws/2003/09/30/soa.html
(2) ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconanatomyofsoapwebservicelifetime.htm
(3) ms- help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconcustomizingsoapinaspnetwebserviceswebserviceclients.htm
**



** “ ** ** 话说天下大事 ** , ** ** ** 分久必合 ** , ** 合久必分 ** ** .”( ** ** 三国演义 ** ** )---- ** ** 软件行业是不是也一样呢 ** ** ? **


现在的软件行业有着各种各样的技术平台 , 体系架构 , 但由于不同平台关注的方面不一样 , 各有各自的特色 , 平台之间很难沟通 , 从而形成一个个的信息孤岛.那如何把这些信息孤岛联系在一起呢 .? 业界提出了很多的方案 , 一个很著名的方案就是 Serviced-Oriented ( 面向服务 ). 那面向服务是什么呢 ? 这是对它的定义 : “SOA is an architectural style whose goal is to achieve loose coupling among interacting software agents. A service is a unit of work done by a service provider to achieve desired end results for a service consumer. Both provider and consumer are roles played by software agents on behalf of their owners.”(1). 面向服务是一系列服务的集合 . 各个服务之间可以互相通信 ( 包括简单的数据传递和多个服务共同参与一个活动 ) , 它通过为各个系统提供一些外部接口 , 从而达到集成各个系统的目的.业界也有些相对应的体系架构 , 例如 : DCOM.CORBA.J2EE. 但都无法彻底实现跨系统的集成 . 个人觉得原因如下 :

1. 接口定义语言无法被不同系统所接收.无论是 DCOM.COBRA 还是 J2EE 都有各自的接口定义语言 ( 都是二进制的 ). 它们都无法被其他系统所接受 . 而接口一旦被设定就很难改变 . 而用户的需求是在不断变化的 .

2. 使用的是二进制的网络协议来进行数据通信 . 很难跨过防火墙 , 而且各自使用的协议没有被广泛的接收 , 这点对 Internet 的运用尤为关键

这时一种新的体系架构出现了 , 它就是 XML Web Services, 微软对它的定义是 : “XML Web services 是提供特定功能元素(如应用程序逻辑)的可编程实体,任何数量的、可能是完全不同的系统都可以用常见的 Internet 标准(如 XML 和 HTTP )访问它。它的核心特征是存在于服务的实现与使用之间的高度抽象化。 ” Web Services 正在迅速的被各个平台所接受 . 相对于其他架构 , 它的优势在与 :

1. 接口定义语言 . 它使用 WSDL 作为接口定义语言 . 这是一种基于 XML 格式的 Document , 而文本是可以被各种系统和平台所认识的 .

2. 使用 HTTP , SOAP , SMTP 等其他被广泛接受的协议进行 数据 通信 . 而 HTTP 是 Internet 的基础协议之一

那如何深入的理解 Web Services 呢 ? 个人觉得应从以下几个方面入手 :

一. 目的

它是实现 SOA 的一种方式 , 是 为了连接不同的系统和计算设备 . 实现系统和数据的互操作性

简单的说是要能够访问不同的系统和计算设备中的数据 . 而不用关心这些数据在各自系统和设备中是如何存放的 . 也可以说成不用关心数据是如何封装的 ( 类似 OO 里的黑盒 )

二. 定义

XML Web Service 顾名思义就是使用 XML 来提供 Web 服务.其实严格的说 Web 可以不要 , 就是 XML Service , 因为并不是所有的 Web Service 都需要 WebServer 的.服务就是把我有的功能提供给使用者 , 也就是向使用者提供一个接口 , 这就是 Web Service .因此 ** Web Service ** ** 绝对不是一种新的分布式对象 . ** 而 DCOM , CORBA ,J2EE 本质上都是分布式的对象 .

三. 组成

1. ** 一些能处理 XML ** ** 的组件 ** .

首先 XML Web Service( 或者 Web Service) 要能够处理 XML , 至于处理 XML 的组件是如何设计的 . 不同语言 , 平台有不同的方式 . 可以是 OO( 面向对象 ) 的 . 也可以是其他方式 . 在 .Net 里是通过 .Net Framework 提供的一些类实现的

** 2. ** ** XML ** ** 文档 **

前面我们说过 Web Service 优势之一在与接口定义语言 (IDL) 是基于 XML 的文档 , 由于 Web Service 是 SOA( 面向服务 ) 的一种 , 而 SOA 的目标是在系统之间建立一种松散的耦合 , 因此服务和消费服务方就不能以 Object 作为数据沟通的纽带或者说锲约 (Contract) , 就必须使用 XML 文档来做为锲约 . 那为了使服务提供方和消费方都能够理解 Contract 的含意 .Web Service 使用 WSDL 来描述 XML 文档 . 即描述对外的接口.同时使用 XML Schema 来描述文档里的数据

** 3. ** ** XML ** ** 文档的载体 **

有了XML文档就需要一个承载它的协议. Web Service 使用 SOAP 作为载. SOAP: 简单对象访问协议 , 严格来说这个名称是错的 , 因为它不是用来访问对象的. MS 给它的定义是 ” SOAP 是一种基于 XML 的、用于在 Web 上交换结构化和类型信息的简单的轻量协议 ” . 它以信封的方式来承载 XML 文档.信封分为两部分 : 信封头 (head) 和信封体 (body) .头一般用来保存一些辅助的信息 , 例如安全 ( 签名和加密数据 ) 和路由信息 , 信封体用来保存锲约即服务的接口描述和具体的数据

** 4. ** ** 服务的地址 **

用来告诉服务消费方从哪里可以访问服务 , 服务位于何地 , 对此

Microsoft 提供了 UDDI( 通用说明、发现和集成 ).

Net 实现 Web Service 的方式是通过 ASP.NET .它封装了很多的细节 , 使开发人员开发 WebService 很方便 , 但造成的结果是使认识本质比较困难 .(MS 的一贯作风 ) .

l ** 通过 Web 方法的形式来调用 Web Service . **

前面说了 Web Service 之间交换的实际上是 XML 文档 , 考虑到很多程序员

不习惯直接操作 XML( 喜欢操作对象及其方法 ) , 在 .Net 里将接收到的

XML 文档转换成对象或作为方法的参数的值 , 同时又会将得到的值或对

象反序列化成 XML 文档发送回服务消费者 , 服务消费者就可以以传统的

调用对象的方法的形式来向服务提供者发送请求从而获得希望的数

据.从消费者提出服务申请到得到相应的结果的流程如下 (2)-:

![](http://dev.csdn.net/article/30/C:/Documents and Settings\ericzou\My Documents\My Pictures\无标题3333333.gif)

由这个流程图 (2) 可以看到 . 客户端要调用 Web Service 首先要发送消息 .

而服务端是通过消息知道有消费者要调用它.因此从某种意义上说 .Web

Service 是一种基于消息的体系架构 , 只不过消息是基于 XML 的文档

l 代理类的产生

代理类的作用是用来方便和 Web 服务进行通信的 . 在 .Net 里可以以自动和手

动 的方式产生 , 两者都是根据服务的 WSDL 文件产生的 . 正如前面所说为了方便

程序员的习惯用法 , .Net 会将 XML 文档反序列化成对象 , 在代理类里也是同样的 .

这样就会给我们一种错觉 , 好像在客户端重新生成了服务端的对象 . 例如 : 一个

Web 方法 Test 向客户返回一个 ObjectA

public class ObjectA

{

public string FieldA

public string FieldB

}

那么在代理类同样会生成一个 ObjectA. 它的结构和服务端的 ObjectA 是一模一

样的 . 但实际上这只是 .Net 为了方便我们使用 Web Service 而人为生成的 ( 这也是

很多人认为 WebService 是用来进行远程对象访问的原因之一 ). 对 Web 服务客户<

Published At
Categories with Web编程
Tagged with
comments powered by Disqus