[Memo]Web Service 的 SOAP 客製化–Method Return 名稱修改
最近剛好都有客戶在問 SOAP 客製化的問題
實務上我們可能會先制定好 WSDL 後再來寫 Web Service
但這樣子極有可能會造成,用工具自動產生的 WSDL 和 原先制定的不一樣
或是,我們必需提供 符合廠商或 Client 要求的 WSDL
那麼我們是否可以程式不用改的情況下,只調整 WSDL 呢?
這個當然是沒問題的
我們先看一下 .NET 預設產生的格式
依 WSDL 規範產生的 SOAP 內容,其中 Method 的部分定義了 HelloWord
而 Response 則會自動變成「HelloWord + Result」
換成是回傳複雜型別的
可以看到也是一樣的情況「HelloWorld2 + Result」
因為 .NET 工具在撰寫 WS 時,為了降低我們處理 WSDL 的工
同時又考量 WSDL 的閱讀性,所以有這樣子的做法。
注意!這個絕對不是 Bug !別誤會了 :)
基本上,若是公司的 WS 是用 .NET 所開發的話
還是建議用 .NET 預設的規範是比較好
之前有看到客戶的 WSDL 之前可能是用別的語言所開發
可能為了少打幾個字,便將命名規則改成了「HelloWorld2 + Rs 」
若是公司是這樣子規定的話,真的要好好思考一下
=============================
接下來我們要看的是 Method 的名稱要更換
一般來說,直接改 Method 名稱是最快的方法
但對外的服務名稱固定了,或是 該 Class 對內已經提供給很多的 Client 用的話
若又就沒法一下子更改,那麼 變更 WSDL 的定義就很方便
只要在 WebMethod 中定義 MessageName 就可以看到 SOAP 的 名稱已經全部都是新的了
當然也包含 Response 的部分
基本上這裡是大部分人都知道的事情
這次我被問到的是,那麼 SOAP Response 的部分,是否也可以改?
這當然是沒問題的!
只要在 Method 前面再加上 return : XmlElement 這個 Attribute
執行後就可以看到 SOAP Response 的部分就不再是 「HelloWorldForAddress + Result」了
而是我自已定義的「HelloAddressReturn」
是不是很簡單
另外!若是用 SoapDocumentMethod 的 ResponseElementName 來定義 SOAP Response 會無法成功修改
建議還是用 標準的寫法比較好
參考資料
如何使用 XML 序列化自訂 SOAP 訊息
http://msdn.microsoft.com/zh-tw/library/thhybys2(v=vs.80).aspx
如何修改整個 Web 服務的預設 SOAP 格式
http://msdn.microsoft.com/zh-tw/library/0d91a695(v=vs.80).aspx
如何控制 Web 服務方法的整體 SOAP 主體格式
http://msdn.microsoft.com/zh-tw/library/k1y9z356(v=vs.80).aspx
.NET Framework 的 SOAP 格式支援
http://msdn.microsoft.com/zh-tw/library/4cxy91t2(v=vs.80).aspx
使用 WSDL 指定的標準 SOAP 訊息格式
http://msdn.microsoft.com/zh-tw/library/x2ccke44(v=vs.80).aspx
如何處理 XML Web Service 用戶端所需的 SOAP 標頭
http://msdn.microsoft.com/zh-tw/library/y4t36w86(v=vs.80).aspx
SOAP 白皮書
http://www.w3.org/TR/2007/REC-soap12-part1-20070427/#soapbodyel