[Memo]Web Service 的 SOAP 客製化–SOAP Return 名稱修改

[Memo]Web Service 的 SOAP 客製化–Method Return 名稱修改

最近剛好都有客戶在問 SOAP 客製化的問題

 

實務上我們可能會先制定好 WSDL 後再來寫 Web Service

 

但這樣子極有可能會造成,用工具自動產生的 WSDL 和 原先制定的不一樣

 

或是,我們必需提供 符合廠商或 Client 要求的 WSDL

 

那麼我們是否可以程式不用改的情況下,只調整 WSDL 呢?

 

這個當然是沒問題的

 

 

我們先看一下 .NET 預設產生的格式

 

image

 

image

依 WSDL 規範產生的 SOAP 內容,其中 Method 的部分定義了 HelloWord

而 Response 則會自動變成「HelloWord + Result」

 

image

image

換成是回傳複雜型別的

 

image

可以看到也是一樣的情況「HelloWorld2 + Result」

 

因為 .NET 工具在撰寫 WS 時,為了降低我們處理 WSDL 的工

 

同時又考量 WSDL 的閱讀性,所以有這樣子的做法。

 

注意!這個絕對不是 Bug !別誤會了 :)

 

 

 

基本上,若是公司的 WS 是用 .NET 所開發的話

 

還是建議用 .NET 預設的規範是比較好

 

之前有看到客戶的 WSDL 之前可能是用別的語言所開發

 

可能為了少打幾個字,便將命名規則改成了「HelloWorld2 + Rs 」

 

若是公司是這樣子規定的話,真的要好好思考一下

 

 

=============================

接下來我們要看的是 Method 的名稱要更換

 

一般來說,直接改 Method 名稱是最快的方法

 

但對外的服務名稱固定了,或是 該 Class 對內已經提供給很多的 Client 用的話

 

若又就沒法一下子更改,那麼 變更 WSDL 的定義就很方便

 

image

只要在 WebMethod 中定義 MessageName 就可以看到 SOAP 的 名稱已經全部都是新的了

 

image

當然也包含 Response 的部分

 

基本上這裡是大部分人都知道的事情

 

這次我被問到的是,那麼 SOAP Response 的部分,是否也可以改?

 

這當然是沒問題的!

 

image

只要在 Method 前面再加上 return : XmlElement 這個 Attribute

 

image

執行後就可以看到 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