偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

WCF獲取服務(wù)元數(shù)據(jù)經(jīng)驗(yàn)總結(jié)

開(kāi)發(fā) 開(kāi)發(fā)工具
WCF獲取服務(wù)元數(shù)據(jù)中包含有許多個(gè)終結(jié)點(diǎn),客戶(hù)端與服務(wù)端可以通過(guò)這個(gè)終結(jié)點(diǎn)來(lái)交換信息。在這篇文章中就介紹了一些相關(guān)的實(shí)現(xiàn)方法,希望對(duì)大家有所幫助。

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

所謂WCF獲取服務(wù)元數(shù)據(jù)(Metadata),歸根結(jié)點(diǎn),實(shí)際上就是獲取服務(wù)的終結(jié)點(diǎn)(Endpoint)的信息,這是服務(wù)公開(kāi)在外的數(shù)據(jù)信息,包括Address、Binding與Contract,也就是所謂的ABCs。

WCF獲取服務(wù)元數(shù)據(jù)可能包含多個(gè)終結(jié)點(diǎn),每個(gè)終結(jié)點(diǎn)相當(dāng)于是通信的入口,客戶(hù)端和服務(wù)端通過(guò)終結(jié)點(diǎn)交換信息。

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

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

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

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

WCF為終結(jié)點(diǎn)定義了一個(gè)專(zhuān)門(mén)的ServiceEndpoint類(lèi),被定義在System.ServiceModel.Description命名空間中。ServiceEndpoint類(lèi)包含了EndpointAddress,Binding,ContractDescription三個(gè)類(lèi)型的屬性,分別對(duì)應(yīng)Endpoint的Address,Binding,Contract。

要WCF獲取服務(wù)元數(shù)據(jù)的終結(jié)點(diǎn),可以通過(guò)抽象類(lèi)MetadataImporter獲取,類(lèi)的定義如下:

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

 

在類(lèi)中,最重要的一個(gè)方法是ImportAllEndpoints(),它能夠獲取服務(wù)的所有終結(jié)點(diǎn),并返回一個(gè)ServiceEndpointCollection類(lèi)型的對(duì)象。該類(lèi)型為一個(gè)終結(jié)點(diǎn)集合,可以通過(guò)調(diào)用ServiceEndpointCollection的Find()方法或FindAll()方法,找到符合條件的一個(gè)或多個(gè)終結(jié)點(diǎn)。它的定義如下:

  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. //其它成員略  

 

我們可以通過(guò)契約類(lèi)型,或者服務(wù)契約的地址,查找符合條件的終結(jié)點(diǎn)。

MetadataImporter類(lèi)只是一個(gè)抽象類(lèi),如果要獲取WSDL元數(shù)據(jù),還會(huì)需要使用繼承它的子類(lèi)型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,需要為其構(gòu)造函數(shù)傳遞一個(gè)MetadataSet類(lèi)型的對(duì)象。而MetadataSet類(lèi)型的對(duì)象則可以通過(guò)MetadataExchangeClient類(lèi)的GetMetadata()方法獲得。MetadataExchangeClient類(lèi)的定義如下所示:

  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. //其它方法略;  

 

假定服務(wù)公開(kāi)的元數(shù)據(jù)地址為http://localhost:8001/IMyService?wsdl,則WCF獲取服務(wù)元數(shù)據(jù)的方法如下:

  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模式,則元數(shù)據(jù)地址的后綴必須為?wsdl。由于我們?cè)谡{(diào)用MetadataExchangeClient的GetMetadata()方法時(shí),傳遞的MetadataExchangeClientMode枚舉參數(shù)值為HttpGet,因此獲取的為基于HTTP-GET的元數(shù)據(jù)。

如果服務(wù)使用的協(xié)議為HTTP或者HTTPS,則可能使用元數(shù)據(jù)交換終結(jié)點(diǎn),也可能為Http-Get模式。此時(shí),我們可以先獲取元數(shù)據(jù)交換終結(jié)點(diǎn),如果沒(méi)有找到,再獲取基于HTTP-GET的終結(jié)點(diǎn):

  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集合對(duì)象后,就可以針對(duì)每個(gè)ServiceEndpoint獲取終結(jié)點(diǎn)的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();  

通過(guò)以上介紹的類(lèi),采用相似的途徑,還可以實(shí)現(xiàn)更多的WCF獲取服務(wù)元數(shù)據(jù),例如服務(wù)契約、回調(diào)契約、基地址、地址、綁定等信息。
 

責(zé)任編輯:曹凱 來(lái)源: 博客園
相關(guān)推薦

2009-12-22 18:36:17

WCF知識(shí)結(jié)構(gòu)

2009-10-15 09:27:00

2010-03-19 14:03:34

云計(jì)算

2009-09-16 17:13:54

學(xué)習(xí)Linq

2009-08-19 09:24:43

AJAX引擎經(jīng)驗(yàn)總結(jié)

2009-09-29 16:32:11

OJB Hiberna

2009-12-25 15:58:37

WPF數(shù)據(jù)處理

2010-04-20 10:41:49

Oracle數(shù)據(jù)庫(kù)

2009-12-22 16:14:01

WCF服務(wù)元數(shù)據(jù)

2009-11-17 11:24:00

PHP應(yīng)用技巧

2009-08-20 17:35:47

Servlet和JSP

2009-09-11 13:29:31

LINQ查詢(xún)操作

2009-09-16 17:44:54

LINQ to SQL

2011-07-08 13:15:52

JSP

2010-06-12 17:37:18

UML實(shí)踐指南

2009-09-08 16:02:47

Linq使用Group

2009-09-08 10:57:55

LINQ查詢(xún)操作

2009-10-22 15:07:12

綜合布線工程

2010-01-26 13:28:11

Android開(kāi)發(fā)要點(diǎn)

2010-01-27 18:12:14

Android dia
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)