成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

WCF獲取服務元數據經驗總結

開發 開發工具
WCF獲取服務元數據中包含有許多個終結點,客戶端與服務端可以通過這個終結點來交換信息。在這篇文章中就介紹了一些相關的實現方法,希望對大家有所幫助。

WCF框架是目前比較受歡迎的一款由微軟研發的開發框架。它的出現實現了跨平臺的網絡解決方案。在這篇文章中就為大家介紹有關WCF獲取服務元數據的相關方法。#t#

所謂WCF獲取服務元數據(Metadata),歸根結點,實際上就是獲取服務的終結點(Endpoint)的信息,這是服務公開在外的數據信息,包括Address、Binding與Contract,也就是所謂的ABCs。

WCF獲取服務元數據可能包含多個終結點,每個終結點相當于是通信的入口,客戶端和服務端通過終結點交換信息。

因而,如果能夠獲取終結點的詳細信息,有助于我們更好地剖析服務的定義、內容與執行方式。

服務有兩種方案可以發布自己的元數據。一種是基于HTTP-GET協議提供元數據;另一種則為元數據交換方式,它往往使用一個專門的終結點,稱之為元數據交換終結點。元數據交換終結點與其它終結點相似,仍然包含了地址、綁定與契約,但是使用的服務契約為WCF提供的接口IMetadataExchange。

實際上,這兩種發布元數據的方式代表了它使用了兩種不同的WCF獲取服務元數據標準協議,前者為HTTP/GET請求,后者為WS-MetadataExchange(MEX)。在WCF,以MetadataExchangeClientMode枚舉類型表示這兩種元數據交換模式:

  1. public enum Metadata
    ExchangeClientMode  
  2. {  
  3. MetadataExchange,  
  4. HttpGet  
  5. }  

WCF為終結點定義了一個專門的ServiceEndpoint類,被定義在System.ServiceModel.Description命名空間中。ServiceEndpoint類包含了EndpointAddress,Binding,ContractDescription三個類型的屬性,分別對應Endpoint的Address,Binding,Contract。

要WCF獲取服務元數據的終結點,可以通過抽象類MetadataImporter獲取,類的定義如下:

  1. public abstract class 
    MetadataImporter  
  2. {  
  3. public abstract Collection
    <ContractDescription> 
    ImportAllContracts();  
  4. public abstract Service
    EndpointCollection
     ImportAllEndpoints();  
  5. //其它方法略;  

 

在類中,最重要的一個方法是ImportAllEndpoints(),它能夠獲取服務的所有終結點,并返回一個ServiceEndpointCollection類型的對象。該類型為一個終結點集合,可以通過調用ServiceEndpointCollection的Find()方法或FindAll()方法,找到符合條件的一個或多個終結點。它的定義如下:

  1. public class ServiceEndpointCollection
     : Collection
    <ServiceEndpoint> 
  2. {  
  3. public ServiceEndpoint Find
    (Type contractType);  
  4. public ServiceEndpoint Find(Uri address);  
  5. public Collection<ServiceEndpoint> 
    FindAll(Type contractType);  
  6. //其它成員略  

 

我們可以通過契約類型,或者服務契約的地址,查找符合條件的終結點。

MetadataImporter類只是一個抽象類,如果要獲取WSDL元數據,還會需要使用繼承它的子類型WsdlImporter:

  1. public class WsdlImporter :
     MetadataImporter  
  2. {  
  3. public WsdlImporter(MetadataSet
     metadata);  
  4. public Collection<Binding>
     ImportAllBindings();  
  5. public override Collection
    <ContractDescription> ImportAllContracts();  
  6. public override ServiceEndpoint
    Collection ImportAllEndpoints();  
  7. public ServiceEndpointCollection 
    ImportEndpoints(Binding wsdlBinding);  
  8. //其它成員略;  

 

如果要使用WsdlImporter,需要為其構造函數傳遞一個MetadataSet類型的對象。而MetadataSet類型的對象則可以通過MetadataExchangeClient類的GetMetadata()方法獲得。MetadataExchangeClient類的定義如下所示:

  1. public class MetadataExchangeClient  
  2. {  
  3. public MetadataExchangeClient();  
  4. public MetadataExchangeClient
    (Binding mexBinding);  
  5. public MetadataExchangeClient
    (EndpointAddress address);  
  6. public MetadataExchangeClient
    (string endpointConfigurationName);  
  7. public MetadataExchangeClient
    (Uri address, MetadataExchangeClientMode mode);  
  8. public MetadataSet GetMetadata();  
  9. public MetadataSet GetMetadata
    (EndpointAddress address);  
  10. public MetadataSet GetMetadata
    (Uri address, MetadataExchangeClientMode mode);  
  11. //其它方法略;  

 

假定服務公開的元數據地址為http://localhost:8001/IMyService?wsdl,則WCF獲取服務元數據的方法如下:

  1. string mexAddress = “http
    ://localhost:8001/IMyService?wsdl”;  
  2. BasicHttpBinding binding = new BasicHttpBinding();  
  3. MetadataExchangeClient mexClient = 
    new MetadataExchangeClient(binding);  
  4. MetadataSet metadata = mexClient.
    GetMetadata(new Uri(mexAddress), 
    MetadataExchangeClientMode.HttpGet);  
  5. MetadataImporter importer = new
     WsdlImporter(metadata);  
  6. ServiceEndpointCollection endpoints = 
    importer.ImportAllEndpoints(); 

注意,如果是HttpGet模式,則元數據地址的后綴必須為?wsdl。由于我們在調用MetadataExchangeClient的GetMetadata()方法時,傳遞的MetadataExchangeClientMode枚舉參數值為HttpGet,因此獲取的為基于HTTP-GET的元數據。

如果服務使用的協議為HTTP或者HTTPS,則可能使用元數據交換終結點,也可能為Http-Get模式。此時,我們可以先獲取元數據交換終結點,如果沒有找到,再獲取基于HTTP-GET的終結點:

  1. string mexAddress = 
    “http://localhost:8001/IMyService?wsdl”;  
  2. BasicHttpBinding binding = 
    new BasicHttpBinding();  
  3. MetadataExchangeClient mexClient = 
    new MetadataExchangeClient(binding);  
  4. MetadataSet metadata = mexClient
    .GetMetadata(new EndpointAddress(mexAddress));  
  5. MetadataImporter importer = 
    new WsdlImporter(metadata);  
  6. ServiceEndpointCollection endpoints = 
    importer.ImportAllEndpoints();  
  7. if (endpoints == null)  
  8. {  
  9. string httpGetAddress = mexAddress;  
  10. if (!mexAddress.EndsWith(“?wsdl”) )  
  11. {  
  12. httpGetAddress += “?wsdl”;  
  13. }  
  14. BasicHttpBinding binding =
     
    new BasicHttpBinding();  
  15. MetadataExchangeClient mexClient =
     
    new MetadataExchangeClient(binding);  
  16. MetadataSet metadata = mexClient.
    GetMetadata(new Uri(mexAddress), 
    MetadataExchangeClientMode.HttpGet);  
  17. MetadataImporter importer =
     
    new WsdlImporter(metadata);  
  18. endpoints = importer.ImportAllEndpoints();  

 

在獲得ServiceEndpointCollection集合對象后,就可以針對每個ServiceEndpoint獲取終結點的Address、Binding、Contract的信息,如下所示:

  1. foreach (ServiceEndpoint endpoint
     in endpoints)  
  2. {  
  3. Console.WriteLine(“Endpoint Name 
    is {0}”, endpoint.Name);  
  4. Console.WriteLine(“Address is {0}”, 
    endpoint.Address.Uri.AbsoluteUri);  
  5. Console.WriteLine(“Binding is {0}”, 
    endpoint.Binding.GetType().ToString());  
  6. Console.WriteLine(“Address is {0}”, 
    endpoint.Contract.Name);  
  7. Console.WriteLine();  

通過以上介紹的類,采用相似的途徑,還可以實現更多的WCF獲取服務元數據,例如服務契約、回調契約、基地址、地址、綁定等信息。
 

責任編輯:曹凱 來源: 博客園
相關推薦

2009-12-22 18:36:17

WCF知識結構

2009-10-15 09:27:00

2010-03-19 14:03:34

云計算

2009-09-16 17:13:54

學習Linq

2009-08-19 09:24:43

AJAX引擎經驗總結

2009-09-29 16:32:11

OJB Hiberna

2009-12-22 16:14:01

WCF服務元數據

2009-12-25 15:58:37

WPF數據處理

2010-04-20 10:41:49

Oracle數據庫

2009-11-17 11:24:00

PHP應用技巧

2009-08-20 17:35:47

Servlet和JSP

2009-09-11 13:29:31

LINQ查詢操作

2009-09-16 17:44:54

LINQ to SQL

2009-10-22 15:07:12

綜合布線工程

2011-07-08 13:15:52

JSP

2010-06-12 17:37:18

UML實踐指南

2009-09-08 16:02:47

Linq使用Group

2009-09-08 10:57:55

LINQ查詢操作

2010-02-26 14:12:27

WCF元數據

2009-03-11 15:40:20

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产成人精品久久久国产成人一区 | 日韩精品在线网站 | 久色一区 | 别c我啊嗯国产av一毛片 | 免费观看一级视频 | 免费精品久久久久久中文字幕 | 亚洲在线观看视频 | 在线第一页 | 国产成人精品一区 | 久久久久久久国产精品 | 成人福利视频 | 国产欧美一区二区三区久久人妖 | 欧美日本韩国一区二区 | av黄色在线观看 | 久久精品成人一区 | 午夜国产一级片 | www.亚洲视频.com| 色综合激情 | 久久久久久久久蜜桃 | 一级毛片免费视频 | 中文在线www | 日韩色综合 | 欧美人妖网站 | 午夜精品一区二区三区免费视频 | 日本三级在线 | 日韩视频专区 | 国产日韩精品视频 | 久久久久久久久久久久久久久久久久久久 | 久久69精品久久久久久久电影好 | 国产精品美女久久久久久免费 | 久久久久午夜 | 久在线| 黄色在线播放视频 | 国产在线观看一区二区三区 | 日本在线播放一区二区 | 亚洲精品国产a久久久久久 午夜影院网站 | 亚洲欧美一区二区三区视频 | a在线观看| 亚洲欧洲成人av每日更新 | 日韩无| 日韩精品一区二区三区中文在线 |