SOAP由來
一項新技術的誕生,往往是因為要解決某些問題,或者改良當時的技術的,SOAP是為了解決應用程序跨互聯網通信問題的,之前的RPC(遠程過程調用)方式雖然也可以解決遠程通信問題,但是安全性和兼容性均存在一些問題,這里只說SOAP的這個方案帶來的好處:
- 作為協議,W3C統一編程標准
- 使用HTTP通信,跨互聯網
- 基於XML,獨立於任何平台
- 可繞過防火牆
從上面幾點可以看出SOAP的最大好處是:由於有W3C的標准支持,當你部署一個服務到公網,在任何地方,任何平台都能以統一的標准解析服務中的標記,並自己生成訪問服務的代碼,進而使用這個服務。
基於這些優點,在2000年微軟,IBM等公司將這套標准形成協議交由著名的W3C,進而才形成了編程領域的統一標准,當然,像這些大型的公司據說有部分員工就是W3C的顧問,國內的軟件公司在這方面做的還不夠,標准的制定對技術的發展有很大的推動。
SOAP標准
一個服務公開了自己的SOAP服務接口后,服務使用方是怎么識別出這些內容代表什么意思呢?這就是標准的意義--形成共識,一個SOAP消息的基本結構是
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Header> ... </soap:Header> <soap:Body> ... <soap:Fault> ... </soap:Fault> </soap:Body> </soap:Envelope>
在之前做的Demo中,一個SOAP消息是這樣的:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/%22> <s:Body> <GetPersonResponse xmlns="http://tempuri.org/%22> <GetPersonResult xmlns:a="http://schemas.datacontract.org/2004/07/WCFServiceDemo%22
xmlns:i="http://www.w3.org/2001/XMLSchema-instance%22> <a:Age>25</a:Age> <a:Name>LeonWeng</a:Name> </GetPersonResult> </GetPersonResponse> </s:Body> </s:Envelope>
上面其實就是一個XML文件內容,包含了服務中的方法名稱和參數等內容,但是這個內容有兩個節點是必不可少的:
- Envelope 這個節點標注了SOAP的命名空間,也可以說標准,個人理解是這個地址是指出了此文件的標准制定方
- Body節點是說明了這個SOAP的調用方法等
SOAP消息還有另外兩個不太常用的節點
- Header可以在這里加入一些頭信息(記得嗎?webservice的用戶名密碼驗證)
- Fault是指在處理SOAP過程中發生的錯誤信息
SOAP消息收發
由於SOAP消息是通過HTTP方式發送的,那么一定是在HTTP標准下進行發送接收的,讓我們通過Fiddler來觀察一下是不是這樣
首先我們向服務端發送一個請求

注意上圖中大的矩形中內容其實就是普通的HTTP請求頭,而下面跟着的即是我們的SOAP包了,這個數據包中含有
- Post 請求方式
- Content-Type 內容類型(這里是XML)和編碼方式
- Host 主機
- Content-Lenth 數據大小
當服務端收到這個消息后就會作出相應的處理了,返回給客戶端了一個數據包

服務端返回的格式依然是標准的HTTP協議格式
HTTP/1.1 200 OK 說明服務器成功處理請求
Server 是服務器的IIS,這里是VS中輕量級的web server
SOAP的自動化
SOAP是應用程序遠程調用的基礎,既然那么重要,可我們為什么不常見到上面說的那些消息格式呢?而經常使用的方式可能是:
var proxy=new TestService.AddServiceClient(); proxy.GetPerson();
這主要是因為開發工具或者說開發框架已經替我們做了協議識別的工作,這個過程跟WSDL密(網絡服務描述語言)
切相關,比如我們調用一個Webservice,visualstudio就會自動根據服務端的WSDL來確定自己要生成的代理類。
以我本機為例,有一個服務
點擊這個地址進去后可以發現這個服務使用WSDL來描述的情況,VS就是根據下面的描述來建立代理類的
然后我們在VS中添加這個服務的引用
然后VS會自動幫我們建立一些代理類來訪問服務,我們可以在MessageService上右鍵,選擇View in Object Browser來查看
代理類的生成情況
通過查看我們可以了解到這個服務所需的一些實體類和接口VS已經幫我們建立好了
總結
SOAP是一種很不錯的跨應用程序、跨平台解決方案,利用XML的多平台性和W3C的統一標准,使各種程序能夠在同
一個標准下進行通信





