閱讀726 返回首頁    go 阿裏雲 go 技術社區[雲棲]


WCF技術剖析之二十六:如何導出WCF服務的元數據(Metadata)[擴展篇]

通過《實現篇》對WSDL元素和終結點三要素的之間的匹配關係的介紹,我們知道了WSDL的Binding元素來源於終結點的綁定對象,那麼這些基於Binding的元數據以及相應的策略斷言是如何被寫入WSDL的呢?WSDL導出擴展(WSDL Export Extension)策略導出擴展(Policy Export Extension)就是為此設計的。

一、WSDL導出擴展(WSDL Export Extension)

終結點的綁定本質上就是相關的綁定元素(BindingElement)的有序組合(關於綁定的深入剖析,可以參考《WCF技術剖析(卷1)》第3章),所以基於綁定的WSDL導出擴展通過綁定元素的形式實現。對於需要向最終導出的WSDL添加於Binding相關的元數據的綁定元素,必須實現System.ServiceModel.Description.IWsdlExportExtension接口。

此外,WSDL導出擴展並不限於被相應的綁定元素用於添加Binding相關的元數據,我們也可以采用終結點行為、契約行為和操作行為(服務行為不可以用於WSDL導出擴展)作為WSDL導出擴展實現在最終生成的WSDL中添加自定義的元數據。作為WSDL導出擴展的上述三種行為同樣需要實現IWsdlExportExtension接口。

下麵的代碼片斷給出了IWsdlExportExtension接口的定義,該接口定義了兩個方法:ExportContract和ExportEndpoint,分別於WsdlExporter的同名方法對應。

   1: public interface IWsdlExportExtension
   2: {
   3:     void ExportContract(WsdlExporter exporter, WsdlContractConversionContext context);
   4:     void ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context);
   5: }

WsdlExporter的定義我們知道,無論是調用ExportContract還是ExportEndpoint方法,並不會直接將導出的元數據返回,最終導出的元數據是通過於另外一個額外的方法GetGeneratedMetadata獲得的。實際上,當調用WsdlExporter的ExportContract或者ExportEndpoint方法的時候,會將導出的元數據暫存一個基於WsdlExporter對象的上下文(Context)之中。對於ExportContract方法,這個上下文對象是WsdlContractConversionContext,而對於ExportEndpoint方法則是WsdlEndpointConversionContext

在執行ExportContract或者ExportEndpoint方法的最後階段,會遍曆所有實現了IWsdlExportExtension接口的WSDL導出擴展元素(對於ExportContract方法,即所有實現了IWsdlExportExtension接口的3種行為對象;對於ExportEndpoint方法,包括實現了IWsdlExportExtension接口的行為對象和綁定元素),並將WsdlExporter對象本身和相應的上下文對象(WsdlContractConversionContext或者WsdlEndpointConversionContext)作為參數執行WSDL導出擴展的ExportContract方法或者ExportEndpoint方法,最終實現了對將定製的元數據寫入最終的WSDL的目的。

WSDL導出擴展並不包含對WS-Policy策略斷言的導出,對此的實現定義在另外一個導出擴展中,即策略導出擴展。

在《WCF技術剖析(卷1)》的第3章對綁定的介紹中,我們說絕大部分WS規範最終都通過綁定實現,或者說,WCF通過定義相應的綁定元素對某個WS規範提供支持。所以,終結點的綁定包含了很多基於相應WS規範的WS-Policy策略斷言需要作為元數據導出到最終生成的WSDL中。比如對於WSHttpBinding,如果采用基於消息的安全模式,需要導出基於WS-Security相關的策略斷言;如何開啟了可靠會話(Reliable Session),需要導出基於WS-RM(WS-Reliable Messaging)相關的策略斷言。在WCF元數據結構體係中,通過策略導出擴展實現對WS-Policy策略斷言的導出。

所有需要實現WS-Policy策略斷言導出的綁定元素,必須實現System.ServiceModel.Description.IPolicyExportExtension接口。IPolicyExportExtension接口僅僅定義了如下一個方法成員:ExportPolicy。

   1: public interface IPolicyExportExtension
   2: {
   3:     void ExportPolicy(MetadataExporter exporter, PolicyConversionContext context);
   4: }

WsdlExporter執行ExportEndpoint方法的最後階段,會創建PolicyConversionContext對象。遍曆所有實現了IPolicyExportExtension接口的綁定元素,並將WsdlExporter對象本身和該PolicyConversionContext對象對象作為參數調用這些綁定元素的ExportPolicy方法。這些作為策略導出擴展的綁定元素將相應的基於WS-Policy策略的元數據導出到PolicyConversionContext對象中。待所有綁定元素執行完畢,再將暫存於PolicyConversionContext的策略元數據附加到上麵提到的WsdlEndpointConversionContext對象上,那麼最後導出的元數據就包含了相應的WS-Policy策略斷言了。


作者:蔣金楠
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
原文鏈接

最後更新:2017-10-30 10:34:17

  上一篇:go  WCF技術剖析之二十六:如何導出WCF服務的元數據(Metadata)[實現篇]
  下一篇:go  WCF技術剖析之二十七: 如何將一個服務發布成WSDL[編程篇]