日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
WCF獲取服務元數據經驗總結

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

創(chuàng)新互聯是一家集網站建設,赫章企業(yè)網站建設,赫章品牌網站建設,網站定制,赫章網站建設報價,網絡營銷,網絡優(yōu)化,赫章網站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網站。

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

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

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

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

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

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

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
     
    ImportAllContracts();
  4. public abstract Service
    EndpointCollection
     ImportAllEndpoints();
  5. //其它方法略;
  6. }

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

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

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

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

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

如果要使用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. //其它方法略;
  12. }

假定服務公開的元數據地址為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的元數據。

如果服務使用的協(xié)議為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();
  19. }

在獲得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();
  8. }

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


本文名稱:WCF獲取服務元數據經驗總結
網站地址:http://www.5511xx.com/article/coedops.html