漫谈Web Service工作原理及.NET平台的实现机制
在现在看来Web Service已经不是什么新技术了,已经得到了广泛的应用,但是,对于初学者来讲,往往会不知其原理,以及实现的方式,只是依葫芦画瓢的照做,而不知道为什么这样做,每一步的道理是什么,本文通过图解和实例去解释Web Service的原理及应用,并针对.NET下的Web Service进行进一步的讲解。
首先,还是进行一系列的概念叙述,虽然听起来很晕,但是当明白了其中的原理,再回来看就没什么了。
Web Service是一个平台独立的,松耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。
XML:(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。
Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。
WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。
UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。
说到这里可以举一个简单的例子,假如我想租房子,但是我并不能找到合适的房子,于是我就找到了房屋中介,房屋中介会在其已登记的房子中查找是否有满足我需要的房子,如果有,房屋中介则会给我该房子地址和联系方式,让我自己去联系联系房主,我便根据房屋中介给我的地址和联系方式去联系房主,进行咨询,最终租下房子。这个过程和Web Service的工作方式十分相似,Web Service的工作原理图如下图所示。
如图所示,首先提供Web Service的服务器会通过1在UDDI服务器登记,自己的服务及位置,然后,当客户端需要相应的Web Service时,由于客户端并不知道提供该Web Service的服务器的位置,因此,先到UDDI服务器中UDDI表进行查询,查得到结果后,UDDI服务器把结果传给了客户端,然后再由客户端根据UDDI服务器提供的联系方式,找到提供该Web Service的服务器,提供该Web Service的服务器会发给客户端WSDL文件,客户端通过WSDL文件,获得调用Web Service的方式,然后客户端和Web Service服务器通过SOAP协议进行相互通讯,最终获得Web Service。
Web Service的详细工作原理图如上图所示。
但是,在实际应用中,由于UDDI服务器已经在互联网上逐渐的消失了,(之前微软和IBM曾经做过免费的UDDI服务器,但是后来经营不下去也都关闭了),因此,一般实际开发时,不会单独去寻找Web Service服务器,而是,在开发时就直接指定该Web Service服务器,也就是说,是从上图中的路径3开始的,1、2路径都已略过。
Web Service设计目的,主要是为了某些网站提供第三方服务,例如天气预报,时间,股票,手机号码查询等业务,例如http://www.webxml.com.cn,http://www.ayandy.com等网站就是专门提供Web Service的服务商,说到这里可以再举一个简单的例子,假如我想买一部手机,我就去手机商店去买,但是,手机商店并不能自己造手机,它必须通过到厂家订购才能才行,那么这就和网站的Web Service的工作方式很相似,如果我设计一个网站,在我的主页上我想显示用户所在地的未来一天的天气情况,但是,我本身并不具备这方面的资料,那么,我就可以去提供天气预报的Web Service网站购买权限,如上述的webxml网站就提供该服务,如下图所示。
因此,当我的网站发布后,我的主页可以在客户端显示用户所在地明天的天气,下面我们就做一个带有天气预报的实例。
首先创建一个网站,
在网站中添加服务引用
添加引用网址,这里用的是http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx,
然后,前往
当搜索到该服务后(必须在联网状态下去做),会得到该服务
这时可以像引用本地类一样,引用该映射过来的服务类
客户端最终的运行结果为
通过这个实例可以看出,Web Service其实就是一个服务接口,其他网站或者客户端无需了解其内部实现,而直接引用其接口即可,当需要服务时,直接发送SOAP协议请求给Web Service服务商,服务商根据请求进行处理后,再通过SOAP协议响应返回结果,这样提高了开发效率,实现了分布式处理机制。
那么,提供Web Service服务者的和请求Web Service服务者之间又是如何实现这个调用过程的呢?下面我们在举一个简单的例子,在本地自己建立一个Web Service,然后本地调用,进一步分析其实现机理。
分别建立两个网站,一个是提供Web Service服务的网站WebSite1,另一个是请求Web Service服务的网站WebSite2。
在WebSite1中新建Web服务,并在其绑定的代码文件中添加一个加法的方法Add,
其中,最重要的是WebService.wsdl文件,它是由提供服务的WebSite1发送给WebSite2的服务描述文件,格式和Schema一样,用来描述Web Service具有哪些方法可以调用,和调用这些方法时,所需的参数和返回值。
public string HelloWorld() { object[] results = this.Invoke("HelloWorld", new object[0]); return ((string)(results[0])); } Add方法的映射方法: public int Add(int a, int b) { object[] results = this.Invoke("Add", new object[] { a, b}); return ((int)(results[0])); }也就是说,WebSite2网站根据WebService.wsdl文件创建和WebSite1网站一一对应的类和方法,因此,我们我可像用本地类一样,直接调用WebSite1网站中的类,其实,是调用在本地动态生成的代理类,所以,每次WebSite2网站调用HelloWorld方法或者Add方法时,先是调用本地的代理类相应的方法,再通过Invoke调用将调用请求打包成SOAP协议请求,发送给WebSite1网站,同时,Invoke方法又负责接收WebSite1网站传回的结果,最终将返回结果,返回给WebSite2的调用程序,并最终显示在客户端。
以上所述的就是Web Service的工作原理,以及在.NET平台下的实现机制,希望对初学者在理解Web Service方面有所帮助。