<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      在WCF中獲取服務元數據信息

      所謂獲取WCF的服務元數據(Metadata),歸根結點,實際上就是獲取服務的終結點(Endpoint)的信息,這是服務公開在外的數據信息,包括Address、Binding與Contract,也就是所謂的ABCs。Juval L?wy在《Programming WCF Services》一書中,用生動形象的棒棒糖表示了終結點的構成:
       figure-1.5.gif

      WCF服務可能包含多個終結點,每個終結點相當于是通信的入口,客戶端和服務端通過終結點交換信息,如下圖所示:
       wcf07.gif

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

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

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

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

      要獲取服務的終結點,可以通過抽象類MetadataImporter獲取,類的定義如下:
          public abstract class MetadataImporter
          {
              public abstract Collection<ContractDescription> ImportAllContracts();
              public abstract ServiceEndpointCollection ImportAllEndpoints();
              //其它方法略;
      }

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

              public Collection<ServiceEndpoint> FindAll(Type contractType);
              //其它成員略
          }

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

      MetadataImporter類只是一個抽象類,如果要獲取WSDL元數據,還會需要使用繼承它的子類型WsdlImporter:
          public class WsdlImporter : MetadataImporter
          {
              public WsdlImporter(MetadataSet metadata);

              public Collection<Binding> ImportAllBindings();
              public override Collection<ContractDescription> ImportAllContracts();
              public override ServiceEndpointCollection ImportAllEndpoints();
              public ServiceEndpointCollection ImportEndpoints(Binding wsdlBinding);
              //其它成員略;
          }

      如果要使用WsdlImporter,需要為其構造函數傳遞一個MetadataSet類型的對象。而MetadataSet類型的對象則可以通過MetadataExchangeClient類的GetMetadata()方法獲得。MetadataExchangeClient類的定義如下所示:
          public class MetadataExchangeClient
          {
              public MetadataExchangeClient();
              public MetadataExchangeClient(Binding mexBinding);
              public MetadataExchangeClient(EndpointAddress address);
              public MetadataExchangeClient(string endpointConfigurationName);
              public MetadataExchangeClient(Uri address, MetadataExchangeClientMode mode);

              public MetadataSet GetMetadata();
              public MetadataSet GetMetadata(EndpointAddress address);
              public MetadataSet GetMetadata(Uri address, MetadataExchangeClientMode mode);

              //其它方法略;
      }

      假定服務公開的元數據地址為http://localhost:8001/IMyService?wsdl,則獲取服務元數據的方法如下:
      string mexAddress = “http://localhost:8001/IMyService?wsdl”;
      BasicHttpBinding binding = new BasicHttpBinding();
      MetadataExchangeClient mexClient = new MetadataExchangeClient(binding);
      MetadataSet metadata = mexClient.GetMetadata(new Uri(mexAddress), MetadataExchangeClientMode.HttpGet);
      MetadataImporter importer = new WsdlImporter(metadata);
      ServiceEndpointCollection endpoints = importer.ImportAllEndpoints();

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

      如果服務使用的協議為HTTP或者HTTPS,則可能使用元數據交換終結點,也可能為Http-Get模式。此時,我們可以先獲取元數據交換終結點,如果沒有找到,再獲取基于HTTP-GET的終結點:
      string mexAddress = “http://localhost:8001/IMyService?wsdl”;
      BasicHttpBinding binding = new BasicHttpBinding();
      MetadataExchangeClient mexClient = new MetadataExchangeClient(binding);
      MetadataSet metadata = mexClient.GetMetadata(new EndpointAddress(mexAddress));
      MetadataImporter importer = new WsdlImporter(metadata);
      ServiceEndpointCollection endpoints = importer.ImportAllEndpoints();

      if (endpoints == null)
      {
      string httpGetAddress = mexAddress;
      if (!mexAddress.EndsWith(“?wsdl”) )
      {
          httpGetAddress += “?wsdl”;
      }
      BasicHttpBinding binding = new BasicHttpBinding();
      MetadataExchangeClient mexClient = new MetadataExchangeClient(binding);
      MetadataSet metadata = mexClient.GetMetadata(new Uri(mexAddress), MetadataExchangeClientMode.HttpGet);
      MetadataImporter importer = new WsdlImporter(metadata);
      endpoints = importer.ImportAllEndpoints();
      }

      在獲得ServiceEndpointCollection集合對象后,就可以針對每個ServiceEndpoint獲取終結點的Address、Binding、Contract的信息,如下所示:
      foreach (ServiceEndpoint endpoint in endpoints)
      {
      Console.WriteLine(“Endpoint Name is {0}”, endpoint.Name);
      Console.WriteLine(“Address is {0}”, endpoint.Address.Uri.AbsoluteUri);
      Console.WriteLine(“Binding is {0}”, endpoint.Binding.GetType().ToString());
      Console.WriteLine(“Address is {0}”, endpoint.Contract.Name);
      Console.WriteLine();
      }

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

      posted @ 2007-09-26 08:50  張逸  閱讀(6636)  評論(7)    收藏  舉報
      主站蜘蛛池模板: 日本午夜精品一区二区三区电影| 丰满少妇特黄一区二区三区| 美女视频黄频大全视频| 闵行区| 精品国产乱码久久久久APP下载| 午夜福利国产精品视频| 色偷偷www.8888在线观看| 人妻系列中文字幕精品| 欧美成人精品手机在线| 成人免费A级毛片无码片2022| 亚洲av成人无网码天堂| 国产SM重味一区二区三区| 国产激情无码一区二区三区| 国产亚洲一区二区三区啪| 国产一区韩国主播| 非会员区试看120秒6次 | 亚洲欧美日韩精品久久亚洲区色播| 成人看的污污超级黄网站免费| 你拍自拍亚洲一区二区三区| 91久久国产成人免费观看| 国产成人久久综合第一区| 好爽毛片一区二区三区四| 人妻av无码一区二区三区| 国产在线自拍一区二区三区| 黄又色又污又爽又高潮| 人妻熟女欲求不满在线| 伊人天天久大香线蕉av色| 免费A级毛片樱桃视频| 亚洲大尺度无码专区尤物| 特级做a爰片毛片免费看无码| 另类图片亚洲人妻中文无码| 亚洲人成电影在线天堂色| 国产女人喷潮视频在线观看| 久久这里有精品国产电影网| 台前县| 国产亚洲精品综合99久久| 亚洲午夜天堂| 少妇人妻偷人精品免费| 亚洲色成人一区二区三区 | 国产拍拍拍无码视频免费 | 亚洲综合小说另类图片五月天|