前面的兩篇文章簡單的介紹了基本的Web Service與Client端與SOAP Extension的加/解密應用,而這次,我們就簡單的來針對SOAP Extension的運作方式來做點更進一步的瞭解。
前面的兩篇文章簡單的介紹了基本的Web Service與Client端與Soap Extension的加/解密應用,而這次,我們就簡單的來針對Soap Extension的運作方式來做點更進一步的瞭解。
讓我們來依照上圖看圖說故事,瞭解SOAP Extension運作的方式:
在我們的SOAP Extension中有一個名為ChainStream的覆寫方法,複寫它的用意是讓我們得以抽換掉原本SOAP訊息中的資料串流內容,我們透過它來將SOAP訊息中的資料串流存放到_oldStream變數中,並以一個新的空資料串流(_newStream)回傳。ChainStream方法在一個完整的SOAP訊息交換中總共會被自動的呼叫四次(Client端和Server端各兩次)。
也因為ChainStream方法在SOAP訊息處理的過程中會自動被呼叫,使得我們無法隨心所欲的在我們想要的時機點去調整SOAP訊息中的串流內容,所以我們還得多實作出一個Copy方法,用來進行資料串流間的複製工作。
而至於改寫訊息內容最重要的部份,就是ProcessMessage這個覆寫方法了。我們可以透過ProcessMessage與SOAP訊息的Stage屬性來判斷目前訊息處於序列化前(Before Serialize)/序列化後(After Serialize)/反序列化前(Before Deserialize)/反序列化後(After Deserialize)這四種階段中的哪一個階段,並且在適合的階段中透過Copy方法和_oldStream、_newStream兩個變數來改寫SoapMessage中的資料串流(以本系列文來說,就是將資料串流加上加解密的加工)。
如上圖所描述,一個從Client端發起的需求,會依以下步驟與Soap Extension進行互動:
1. 呼叫Client端SOAP Extension中的Initialize方法,並且自動呼叫Client端的ChainStream方法
2. 呼叫Client端SOAP Extension中的ProcessMessage方法(這時SOAP訊息的狀態為序列化前)
3. 呼叫Client端SOAP Extension中的ProcessMessage方法(這時SOAP訊息的狀態為序列化後)
4. Client端將序列化後的SOAP訊息送往Server端,Server也隨即會執行Server端SOAP Extension的Initialize方法及ChainStream方法
5. 呼叫Server端SOAP Extension中的ProcessMessage方法(這時SOAP訊息的狀態為序列化前)
6. 呼叫Server端SOAP Extension中的ProcessMessage方法(這時SOAP訊息的狀態為序列化後)
7. Server端依照SOAP訊息中的內容執行相對應的Web Method,且透過ChainStream方法將執行結果的輸出內容複製給SOAP Extension使用
8. 呼叫Server端SOAP Extension中的ProcessMessage方法(這時SOAP訊息的狀態為反序列化前)
9. 呼叫Server端SOAP Extension中的ProcessMessage方法(這時SOAP訊息的狀態為反序列化後)
10. Server端將結果回傳給Client端,Client端再次自動呼叫ChainStream方法
11. 呼叫Client端SOAP Extension中的ProcessMessage方法(這時SOAP訊息的狀態為反序列化前)
12. 呼叫Client端SOAP Extension中的ProcessMessage方法(這時SOAP訊息的狀態為反序列化後),並且結束整個SOAP訊息傳遞的流程。
由於這次範例的需求是要針對序列化後及反序列化前的資料動手腳,因此我們在SOAP Extension的ProcessMessage方法中只需要針對AfterSerialize與BeforeDeserialize兩個階段的資料動手腳就行啦。
另外,需要特別注意的是:透過Copy方法複製資料串流的使用時機以及從資料串流中讀取資料前要先記得將串流的起始位置歸零,並且在讀取後再次進行歸零的動作,以避免自動呼叫ChainStream時拿到空的資料串流。
以上,希望能透過這系列的文章幫助到對Web Service有特殊需求的朋友們。