對于Web HTTP程式設計模型來說,服務契約中作為操作的方法無須應用OperationContractAttribute特性,隻需要根據需要應用WebGetAttribute與WebInvokeAttribute特性即可。前者針對GET HTTP方法,或者則針對其他HTTP方法。WebGetAttribute與WebInvokeAttribute的屬性BodyStyle和IsBodyStyleSetExplicitly涉及到“Web消息主體風格”的話題。
我們知道請求消息和回複消息分别是對操作方法輸入參數和傳回值(輸出參數和引用參數)的封裝,WebMessageBodyStyle中的Bare表示請求消息和回複消息的主體部分僅僅包含針對輸入參數和傳回值(輸出參數和引用參數)序列化後的内容,而Wrapped則會在外面包裝一個基于目前操作的“封套”。枚舉項WrappedRequest和WrappedResponse用于單獨針對請求消息和回複消息的主體進行封裝。
WebGetAttribute與WebInvokeAttribute的屬性BodyStyle的預設值為Bare。如果該屬性被設定成WrappedRequest,則回複消息主體依然采用Bare風格;如果該屬性被設定成WrappedResponse,則請求消息主體依然采用Bare風格。布爾類型的隻讀屬性IsBodyStyleSetExplicitly表示是否針對屬性BodyStyle進行了顯示設定。
目錄 一、Xml+Bare 二、Xml+Wrapped 三、JSON+Bare 四、JSON+Wrapped 五、Bare請求消息風格對單一輸入的限制 六、Bare回複消息風格對單一輸出的限制
我們針對如下所示的代碼通過服務調用添加一個姓名為“王五”的員工。
針對如上所示的服務調用,由于消息格式和主體風格分别為Xml和Bare,是以作為請求消息和回複消息的主體僅僅是Employee對象被序列化後生成的XML片斷,具體内容如下所示。
二、Xml + Wrapped
現在我們對契約接口略加修改,将應用在操作方法Create上的WebInvokeAttribute特性的屬性BodyStyle設定為Wrapped。
針對相同的服務調用,請求消息和回複消息将具有如下所示的主體内容。我們可以看出Employee被序列化後生成的XML在請求消息中作為<Create>元素的子元素;對于回複消息來說,Employee被序列化後生成的XML的根元素名稱為CreateResult,而不是<Employee>,而整個<CreateResult>内嵌于< CreateResponse >元素中。
三、JSON+ Bare
上面我們通過執行個體示範了消息格式為Xml情況下針對不同風格的消息主體的内容差異,現在我們按照相同的方式來讨論當消息格式為JSON的時候,針對不同風格的消息主體在結構上又具有怎樣差異。如下面的代碼片斷所示,我們通過對契約接口的修改将服務操作Create的消息格式和主體風格設定成Json和Bare。
同樣針對之前的服務調用,以JSON形式表示的Employee對象将直接作為請求消息和回複消息的主體部分,具體的内容如下所示。(S1004)
四、JSON+ Wrapped
我們最後來示範Json消息格式在Wrapped風格下具有怎樣的結構,為此我們隻需要将應用在Create操作方法上的WebInvokeAttribute特性的BodyStyle屬性設定為Wrapped。
如下面的代碼所示,由于請求消息和回複消息采用Wrapped風格,表示Employee的JSON對象最終作為最終JSON對象的“employee”屬性和“CreateResult”屬性。(S1005)
對于Bare消息主體風格來說,意味着對象被序列化後生成的XML或者JSON表示直接作為消息的主體,是以隻适用于單一對象。具體來說,隻有具有唯一輸入參數的操作方法才能将請求消息的主題風格設定為Bare。
如上所示的是我們熟悉的計算服務的契約接口的定義。消息主體風格為Bare的操作方法Create具有兩個輸入參數(x和y),在對實作了該契約接口進行寄宿的時候就會抛出如下圖所示的InvalidOperationException異常,提示“約定“ICalculator”的操作‘Add’指定要序列化多個請求正文參數,但沒有任何包裝元素。如果沒有包裝元素,至多可序列化一個正文參數。請删除多餘的正文參數,或将 WebGetAttribute/WebInvokeAttribute 的 BodyStyle 屬性設定為 Wrapped”。
<a href="http://images.cnblogs.com/cnblogs_com/artech/201202/201202060851454670.png"></a>
由于回複參數是對傳回值、引用參數和輸出參數的封裝,是以當操作方法具有引用參數或者輸出參數時不能将回複消息的主體風格設定為Bare。
同樣以計算服務契約為例,現在我們通過如上的方式以輸出參數的形式傳回加法運算的結果,并将應用在操作方法上的WebInvokeAttribute特性的BodyStyle屬性設定為WrappedRequest,這意味着請求消息和回複消息分别采用Wrapped和Bare風格。當我們對實作了該契約接口的服務設施寄宿時會抛出下圖所示的InvalidOperationException異常,并提示“約定‘ICalculator’的操作‘Add’至少指定一個響應正文參數不是操作的傳回值。當 WebGetAttribute/WebInvokeAttribute 的 BodyStyle 屬性設定為 Bare 時,隻允許使用傳回值。請删除多餘的響應正文參數或将 BodyStyle 屬性設定為 Wrapped”。
<a href="http://images.cnblogs.com/cnblogs_com/artech/201202/201202060852008240.png"></a>
本文轉自左正部落格園部落格,原文連結:http://www.cnblogs.com/soundcode/p/4036194.html,如需轉載請自行聯系原作者