WebServices中XML、SOAP和WSDL的⼀些必要知识
Web Services 是由xml来定义数据格式的,通过SOAP协议在各个系统平台中传输,那么接下来讨论下SOAP和WSDL的各⾃作⽤。SOAP和WSDL对Web Service、WCF进⾏深⼊了解的基础,因此花⼀些时间去了解⼀下是很有必要的。
⼀、SOAP(Simple Object Access Protocol)
如果我们要调⽤远程对象的⽅法,就必定要告诉对⽅,我们要调⽤的是⼀个什么⽅法,以及这个⽅法的参数的值等等。然后对⽅把数据返回给我们。这其中就涉及到两个问题:1、数据如何在⽹络上传输。2、如何表⽰数据?⽤什么格式去表⽰函数以及它的参数等等。1、SOAP的传输协议
SOAP的传输协议使⽤的就是HTTP协议。只不过HTTP传输的内容是HTML⽂本,⽽SOAP协议传输的是SOAP的数据。看⼀下下⾯的例⼦:这是⼀个HTTP请求(请求google的⾸页)的内容:
GET / HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap,application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; CIBA) chromeframe/4.0Accept-Encoding: gzip, deflateConnection: Keep-AliveHost: www.google.com
Cookie: PREF=ID=d8f9f1710bfa5f72:U=a5b3bec86b33ef:NW=1:TM=1260238598:LM=1260241971:GM=1:S=q2agYsw3BsoOQMAs;
NID=29=JgIGDDUx70IQTBVAnNEP_E9PLLKBI9STjzaBjgq1eWuDg-_jCgFpka59DrOC0aZKLbj4q77HU1VMKscXTP3OaseyTbv3c2XPe9dS7lsXDHAkAnS46vy-OU8XRqbmxJ; rememberme=true;
SID=DQAAAH4AAABW7M4nVkTeOR7eJUmC1AJ4R6hYbmVewuy_uItLUTzZMUTpojdaHUExhPa_EPAkO9Ex1u3r7aPXZ5cj28xHnv2DbfRYf5AyaBcimciuOTITKSIkqn3QSpGDFkRS1Xn7EGzDpCVHSID=AFEFTMA68EgNjkbil; __utmx=173272373.; __utmxx=173272373.---------如果有Post的数据,这⾥还会有Post的数据--------这个是⼀个SOAP请求的内容:
POST /WebServices/WeatherWebService.asmx HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3603)Content-Type: text/xml; charset=utf-8
SOAPAction: \"http://WebXml.com.cn/getSupportCity\"Host: www.webxml.com.cnContent-Length: 348Expect: 100-continueConnection: Keep-Alive
⼴东
可以看到,⼀个SOAP请求其实就是⼀个HTTP请求,但为了表明内容是SOAP的数据,需要加⼊上⾯请求中红⾊字的部分来以⽰区别。也就是说,如果请求头中有SOAPAction这⼀段,那么请求会被当作SOAP的内容来处理⽽不会当作HTML来解析。可以⽤上⾯指定SOAPAction头来表⽰内容是SOAP的内容,也可以指定 Content-Type:
application/soap+xml 来表⽰内容是SOAP的内容。SOAP请求中最后的那段XML数据,这个就是请求的具体内容,这个就是SOAP规定的请求的数据格式,下⾯再详细对格式进⾏说明。
2、SOAP的数据格式
现在知道了SOAP是通过HTTP协议的POST⽅法来传输数据的,只不过是请求的Header中加了⼀些标志来说明⾃⼰是⼀个SOAP请求。那么数据的具体格式是怎么规定的呢,我们把上⾯请求的XML数据展开看⼀下:
⼴东
其中的⾥⾯的内容就是请求的内容,请求的⽅法为getSupportCity,该⽅法有⼀个名为byProvinceName的参数,参数的值为“⼴东”这个字符串。再看⼀下返回的内容:HTTP/1.1 200 OK
Date: Mon, 14 Dec 2009 05:55:39 GMTServer: Microsoft-IIS/6.0X-Powered-By: ASP.NETX-AspNet-Version: 2.0.50727
Cache-Control: private, max-age=0Content-Type: text/xml; charset=utf-8Content-Length: 1052
⼴州 (59287)深圳 (59493)潮州 (59312)韶关 (59082)湛江 (59658)惠州 (59298)清远(59280)
东莞 (592)江门 (59473)茂名 (59659)肇庆 (59278)汕尾 (59501)河源 (59293)揭阳 (59315)梅州 (59117)中⼭ (59485)德庆 (59269)阳江 (59663)云浮 (59471)珠海 (59488)汕头 (59316)佛⼭ (59279)
返回的HTTP头中并没有标志来表明是⼀个SOAP的响应,因为的确没有必要,请求⽅发送出的SOAP请求,返回的肯定是SOAP的响应。⼀个典型的SOAP请求格式的结构如下:
234
Apples
下⾯逐个解释⾥⾯的元素:a) Envelope
SOAP的请求内容必须以Envelope做为根节点。
xmlns:soap=\"http://www.w3.org/2001/12/soap-envelope\",不能修改,否则会出错。http://www.w3.org/2001/12/soap-envelope⾥⾯有Envelope的schema的相关定义。有兴趣的可以去这个链接的内容。
soap:encodingStyle=\"http://www.w3.org/2001/12/soap-encoding\",这个指定了数据元素的类型。
b) Header
这个是可选的,如果需要添加Header元素,那么它必须是Envelope的第⼀个元素。
Header的内容并没有严格的,我们可以⾃⼰添加⼀些和应⽤程序相关的内容,但是客户端⼀定要记得处理这些Header元素,可以加上mustUnderstand强制进⾏处理。c) Body
这个就是请求的主题内容了,请求什么函数,参数是什么类型等等都在这⾥⾯指定。 ⽤标签表⽰⼀个函数,然后⽤⼦元素表⽰它的参数。
在调⽤中没有指定参数和返回类型,这⾥不需要指定,因为提供服务的⼀⽅⾃⼰已经规定好了数据类型,在调⽤时指定数据类型没有任何意义。
⼆、WSDL(Web Services Description Language)
WSDL是⽤来描述WebService的,它⽤XML的格式描述了WebService有哪些⽅法、参数类型、访问路径等等。我们要使⽤⼀个WebService肯定⾸先要获取它的WSDL,在VS中添加⼀个Web 引⽤时,这些⼯作由开发环境帮我们做了,开发环境根据WSDL⽂档给Web Service⽣成了相应的代理类供我们使⽤。下⾯是⼀个HelloWorld的WebService的服务端代码:public class Service : System.Web.Services.WebService{
public Service () {
//Uncomment the following line if using designed components //InitializeComponent(); }
[WebMethod]
public DateTime HelloWorld(int i){
return DateTime.Now;}}
其对应的WebService的WSDL⽂档如下:1
2 xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:mime=\"http://schemas.xmlsoap.org/wsdl/mime/\" xmlns:tns=\"http://tempuri.org/\"xmlns:s=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://schemas.xmlsoap.org/wsdl/soap12/\" xmlns:http=\"http://schemas.xmlsoap.org/wsdl/http/\"targetNamespace=\"http://tempuri.org/\" xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\">3 4 5 6 7 8 9
10
11 12 13 14 15 16
17 18 19
20
21 22 23
24 25 26
27 28 29 30 31
32
33 34 35 36 37 38 39
40 41 42
43
44
45 46 47 48 49 50 51
52 53 54
55
56
57 58 59 60
61 62 63
65
⼀个WSDL⽂档由四部分组成:1、types
指定了WebService⽤到的所有数据类型,上⾯⽤到了两种数据类型,int和datetime
2、message
指明⼀个操作所⽤到的数据类型。
HelloWorldSoapIn是指HelloWorld的输⼊操作⽤到的数据类型,HelloWorldSoapOut是指HelloWorld的输出操作⽤到的数据类型。⼆者的element元素指出了与types中对应到的具体类型。
3、portType
指出了这个WebService所有⽀持的操作,就是说有哪些⽅法可供调⽤。
这⾥⽀持⼀个HelloWorld调⽤,它的输⼊和输出对应到HelloWorldSoapIn和HelloWorldSoapOut这个两个数据类型。4、binding
soap12:binding元素的transport指明传输协议,这⾥是http协议。 operation 指明要暴露给外界调⽤的操作。
use属性指定输⼊输出的编码⽅式,这⾥没有指定编码。5、services
指定服务的⼀些信息,主要是指定服务的访问路径。