SOAP消息机制简介
SOAP(Simple Object Access Protocol,簡單對象訪問協(xié)議)作為一種信息交互協(xié)議在分布式應(yīng)用中非常廣泛,如WebService。在使用.Net開發(fā)WebService時 候,只需要在對應(yīng)的方法上加上WebMethod特性然后就可以通過網(wǎng)絡(luò)進(jìn)行SOAP消息的發(fā)送。這樣在平時使用Webservice時,可能不太關(guān)心 SOAP消息的結(jié)構(gòu)到底是怎樣的。下面大致說說SOAP消息的結(jié)構(gòu),以及使用工具監(jiān)聽SOAP消息報文。
本節(jié)目錄:
- 1、XSD是什么
- 2、基于SOAP的數(shù)據(jù)交互系統(tǒng)是XSD的
- 3、SOAPSOAP消息結(jié)構(gòu)
- 4、支持SOAP的協(xié)議
- 5、通過SOAPHeader擴(kuò)展SOAP
- 6、SOAP自定義異常
- 7、監(jiān)聽SOAP消息
1、XSD是什么 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
XSD(XML Scheme Definition,XML大綱定義)文檔用來描述XML的結(jié)構(gòu)和內(nèi)容。它本身也是一個XML文檔,通過它我們可以知道xml文檔中包含哪些節(jié)點(diǎn),以及這些節(jié)點(diǎn)應(yīng)該是什么類型的值等。常見的如WSDL文檔。
2、基于SOAP的數(shù)據(jù)交互系統(tǒng)應(yīng)該是XSD的 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
WebService數(shù)據(jù)交互格式是基于SOAP的,而實(shí)際上SOAP就是具有SOAP格式的XML數(shù)據(jù)。基于XML的跨平臺特性,各個系統(tǒng)在調(diào)用 WebService時,都需要能準(zhǔn)確的理解WebService需要什么類型的參數(shù),有哪些參數(shù),返回值是什么等等。要很好的說明這些問題,XSD是一 種很好的選擇。所以說這類系統(tǒng)是XSD的。。
3、SOAP消息結(jié)構(gòu) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
首先看看如下SOAP請求消息:
它包含由SOAP信封(<soap:Envelope>) SOAP 頭(<soap:Header>) SOAP消息體 (<soap:Body>)組成。其中<soap:Envelope>是SOAP消息中的根節(jié)點(diǎn),是SOAP消息中必須的部 分;<soap:Header>是SOAP消息中可選部分,如果SOAP消息中含有它,那么它一定要是soap:Envelope>中 的第一個元素節(jié)點(diǎn);<soap:Body>是SOAP中必須部分,如果SOAP消息中沒有<soap:Header>,那 么<soap:Body>必須是SOAP中第一個元素節(jié)點(diǎn)。
此外:在WebService返回給消費(fèi)者時,如果服務(wù)發(fā)生異常,則返回給服務(wù)消費(fèi)者還有<soap:Fault>元素節(jié)點(diǎn),它包含在<soap:Body>中。如下:
| 1 2 3 4 5 6 7 8 | <soap:Body> <soap:Fault> <faultcode xmlns:q0="ns=cnblogs.com/tyb1222">q0:code</faultcode> <faultstring>System.Web.Services.Protocols.SoapException: 0x00</faultstring> <faultactor/> <detail /> </soap:Fault> </soap:Body> |
<faultcode>是<soap:Fault>中必須的元素節(jié)點(diǎn),它讓消費(fèi)者能識別錯誤。
<faultstring>是<soap:Fault>中必須的元素節(jié)點(diǎn),用來描述錯誤文本信息
<faultactor/>不是<soap:Fault>中必須的元素節(jié)點(diǎn),用來描述是在哪個路由節(jié)點(diǎn)上出錯。
<detail >用來描述與<soap:Body>有關(guān)的應(yīng)用程序集錯誤信息。如果Body不能被正確處理,那 <detail >就是<soap:Fault>中必須元素
4、支持SOAP的協(xié)議 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
通常,訪問的WebService都是通過Web服務(wù)器。訪問Web服務(wù)器最常見的應(yīng)用協(xié)議當(dāng)然是久負(fù)盛名的HTTP了。HTTP也就成了支持SOAP最常用的協(xié)議。實(shí)際上支持SOAP支持的任何傳輸協(xié)議實(shí)現(xiàn)應(yīng)用程序之間的通訊,包括TCP、SMTP等。
5、通過SOAPHeader擴(kuò)展SOAP ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
在.Net平臺上開發(fā)WebService,如果不通過SOAPHeader對SOAP頭進(jìn)行擴(kuò)展,SOAP消息中只 有<soap:Envelope>、<soap:Body>這兩個SOAP中必須的兩個節(jié)點(diǎn)。很多時候SOAPHeader的使 用也是SOAP種經(jīng)常用到的部分,如通過SOAPHeader 對消費(fèi)者做身份認(rèn)證,或者給SOAP消息中使用Actor來進(jìn)行SOAP消息路由等。
通過SOAPHeader擴(kuò)展SOAP,可以在派生類中重寫SOAPHeader的實(shí)現(xiàn)。注意通過派生類實(shí)現(xiàn)對SOAPHeader重寫時,需要給派生類定義一個無參數(shù)構(gòu)造函數(shù),否則發(fā)布訪問WebService時會報因為沒有無參數(shù)構(gòu)造函數(shù)而無法序列化的問題。
簡要介紹一下擴(kuò)展SOAPHeader。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class EaxmHeader : SoapHeader { ?????public string UserName { get; set; } ?????public string Password { get; set; } ????public EaxmHeader() ????{ ????} ????public EaxmHeader(string userName,string password) ????{ ????????UserName = userName; ????????Password = password; ????} } |
然后在WebService具體函數(shù)接口上通過SOAPAttribute中MemberName設(shè)置為將EaxmHeader對象添加。如下:
[WebMethod]
[SoapHeader("header", Direction = SoapHeaderDirection.InOut)]
public int divide(int x, int y)
6、SOAP自定義異常 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
網(wǎng)絡(luò)通信中發(fā)射異常是難免的。有時為了保障服務(wù)的安全性而盡量少暴露服務(wù)信息并且需要讓消費(fèi)者知曉在調(diào)用過程中發(fā)生異常的原因,一般可通過拋出自定義 SOAPException異常,在<soap:Fault> 中自定義<faultcode>錯誤碼和 <faultstring>提示文本信息。如在catch中 throw new SOAPException(...)
7、監(jiān)聽SOAP消息 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
SOAP消息監(jiān)聽工具有MSSoapT(Microsoft SOAP ToolKit),tcpTrace等工具。下面就說說使用它們來監(jiān)聽SOAP消息。
發(fā)布完WebService以后,可以通過WSDL通過WebService URI地址或者是WebService的WSDL文檔來生成服務(wù)代理類(參見前一節(jié))。
代理類生產(chǎn)完成以后,在代理類的構(gòu)造函數(shù)中設(shè)置端口號。如:
| public class ExamService : SoapHttpClientProtocol { ????private SendOrPostCallback divideOperationCompleted; ????/// <remarks/> ????public ExamService() ????{ ????????Url = "http://193.168.11.94:8866/ExamService/WebService1.asmx"; ????} .... } |
上面http://193.168.11.94:8866 就是在使用工具監(jiān)聽SOAP消息時本地的端口號。注意:如果是在VS調(diào)試環(huán)境下,使用Asp.Net Development Server也會使用一個端口號,實(shí)際監(jiān)聽的端口號是代理類中設(shè)置的端口,和它一般是不同。
7.1、使用MSSoapT監(jiān)聽SOAP 消息 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
設(shè)置監(jiān)聽端口、主機(jī)等信息,如下圖:
這樣,調(diào)試程序時,MSSoapT監(jiān)聽到SOAP 消息如下圖:
上半部分為請求SOAP消息,下部分為返回SOAP消息。如下圖:
7.2、使用tcpTrace監(jiān)聽SOAP 消息。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
這樣監(jiān)聽到的消息如下圖:
總結(jié)
以上是生活随笔為你收集整理的SOAP消息机制简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 炸鱼块怎么做酥脆好吃 告别油腻,做出口感
- 下一篇: 方太油烟黄标贴和黑标贴一样吗?