程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WCF技術剖析之二十六:如何導出WCF服務的元數據(Metadata)[擴展篇]

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

編輯:關於.NET

通過《實現篇》對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策略斷言的導出,對此的實現定義在另外一個導出擴展中,即策略導出擴展。

二、策略導出擴展(Policy Export Extension)

在《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策略斷言了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved