漫谈Web Service工作原理及.NET平台的实现机制

来源:互联网 发布:股票走势软件 编辑:程序博客网 时间:2024/06/05 09:11

在现在看来Web Service已经不是什么新技术了,已经得到了广泛的应用,但是,对于初学者来讲,往往会不知其原理,以及实现的方式,只是依葫芦画瓢的照做,而不知道为什么这样做,每一步的道理是什么,本文通过图解和实例去解释Web Service的原理及应用,并针对.NET下的Web Service进行进一步的讲解。

首先,还是进行一系列的概念叙述,虽然听起来很晕,但是当明白了其中的原理,再回来看就没什么了。

Web Service是一个平台独立的,松耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是通过SOAPWeb上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。 

XML(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。 

Soap(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAPXML文档形式的调用方法的规范,它可以支持不同的底层接口,像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服务器会通过1UDDI服务器登记,自己的服务及位置,然后,当客户端需要相应的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开始的,12路径都已略过。

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

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Services;[WebService(Namespace = "http://tempuri.org/")][WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]public class Service : System.Web.Services.WebService{    public Service () {    }    [WebMethod]    public string HelloWorld() {        return "Hello World";    }    [WebMethod]    public int Add(int a,int b) {        return a+b;    }}

和上例一样,在WebSite2中添加服务引用,创建映射过来的服务对象,并获得Web Service功能,代码如下:

              int a = 1;              int b = 2;              var ws =new localhost.WebService();              var result = ws.Add(a, b);              var hello = ws.HelloWorld();              This.lableResult.Text=result.toStrring()+<br/>+hello.toStrring(); 

那么,这个过程又是如何实现的的呢?当我们在引用Web Service,到底发生了什么?下面我们来一一讲解。

首先,我们先看一下,在引用目录Web References的localhost命名空间下,有下面三个文件,如下图所示。


其中,最重要的是WebService.wsdl文件,它是由提供服务的WebSite1发送给WebSite2的服务描述文件,格式和Schema一样,用来描述Web Service具有哪些方法可以调用,和调用这些方法时,所需的参数和返回值。

  <wsdl:types>      <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">        <s:element name="HelloWorld">          <s:complexType />        </s:element>        <s:element name="HelloWorldResponse">          <s:complexType>            <s:sequence>              <s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" />            </s:sequence>          </s:complexType>        </s:element>        <s:element name="Add">          <s:complexType>            <s:sequence>              <s:element minOccurs="1" maxOccurs="1" name="a" type="s:int" />              <s:element minOccurs="1" maxOccurs="1" name="b" type="s:int" />            </s:sequence>          </s:complexType>        </s:element>        <s:element name="AddResponse">          <s:complexType>            <s:sequence>              <s:element minOccurs="1" maxOccurs="1" name="AddResult" type="s:int" />            </s:sequence>          </s:complexType>        </s:element>      </s:schema>    </wsdl:types>

然后,VS通过一个wsdl.exe程序,将根据该WebService.wsdl文件动态的创建一个代理类,并生成一个Reference.cs文件,在文件中我们就可以看到关于HelloWorld和Add方法的映射方法。

HelloWorld方法的映射方法:

          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方面有所帮助。

原创粉丝点击