創建一個自定義代理
既然已經了解了為什麼Web服務返回一個SOAP錯誤我們就可以創建一個自定義代理來生成網服務期待的SOAP包裝雖然創建一個自定義SOAP包裝肯定比使用一個由VSnet或者WSDLexe公用程序生成的SOAP包裝要花更多的時間但是這樣做可以完全控制包裝的內容為了開始創建自定義代理我創建一個名為msnewsserviceproxy的包含兩個字段的新類
以下為引用的內容
public class MSNewsServiceProxy {
string _uri;
string _soapAction;
}
uri字段保存了Web服務的位置而_soapAction字段保存了將要使用SOAP包裝發送的SOAPAction數據頭的名稱在MSNewsServiceProxy類之內添加CreateSoapEnvelope ()SendSoapEnvelope ()和FilterResult ()這三個方法這些方法生成SOAP包裝請求把它發送到Web服務然後過濾返回的SOAP包裝讓我們逐一的看看每個方法注意代碼在SOAP包裝的根元素上添加一個SOAP ENV域名空間前綴Web服務顯然需要這個特定的前綴而拒絕任何不包含這個前綴的信息因為VSnet生成的代理發送一個soap域名空間前綴(而不是SOAP ENV)所以它的消息被拒絕Web服務不應該需要一個特定的域名空間前綴而為此拒絕不帶此前綴的消息但是域名空間問題也是你必須注意要想使工作更好的完成要執行一些看上去不{>可思議的事情
在SOAP包裝被創建之後SendSoapEnvelope ()方法(見代碼段)使用了幾個SystemNet和SystemIO域名空間中的類來把這個包裝發送到Web服務中代碼首先通過把_uri變量傳送到對象構造器來創建一個HttpWebRequest對象其次與這個請求相關聯的相應的MethodContentType和Header都將被發送
然後一個StreamWriter對象和HttpWebRequest對象的請求流相關聯SOAP包裝就被使用StreamWriter的Write ()方法寫到流中
從Web服務返回的SOAP包裝被HttpWebResponse對象的SendSoapEnvelope ()方法獲得
HttpWebResponse response = (HttpWebResponse)request
GetResponse();
如果應答不是空值它將被載入一個XMLTextReaderXMLTextReader被用來填充XmlDocument對象然後從這個方法中返回XmlDocument對象
FilterSoapEnvelope ()方法分析SOAP應答包裝並把從Web服務中返回的數據裝入自定義代理的消費者使用的XmlDocument對象
以下為引用的內容
private XmlDocument
FilterSoapEnvelope(
XmlDocument doc) {
XmlDocument filterDoc =new XmlDocument();
XmlNode result = docSelectSingleNode(//results);
XmlNode resultImport = filterDocImportNode(resulttrue);
filterDocAppendChild(resultImport);
return filterDoc;
}
雖然過濾器可以使用好幾種方法執行但是FilterSoapEnvelope ()方法依靠XPath語句可以在應答SOAP包裝中得到結果元素
微軟新聞組PHP Web服務展示了允許取得新聞組新聞摘要的兩種方法getheaders ()和getmessage () 你可以看到如何在自定義代理類中使用這兩種方法(見代碼段) 注意每個方法中的代碼傳遞Web服務方法名被調用到CreateSoapEnvelope ()方法和任何使用這個方法關聯的參數 在SOAP包裝被發送以及應答被接受之後FilterSoapEnvelope ()方法被調用來把返回的數據加載到一個XmlDocument對象中同樣這個對象也是代理消費者使用的
[] []
From:http://tw.wingwit.com/Article/program/net/201311/15521.html