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

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

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

      WCF分布式開發步步為贏(3)WCF服務元數據交換、配置及編程開發

      今天我們繼續WCF分布式開發步步為贏(3)WCF服務元數據交換、配置及編程開發的學習。經過前面兩節的學習,我們了解WCF分布式開發的相關的基本的概念和自定義宿主托管服務的完整的開發和配置過程。今天我們來詳細學習WCF服務元數據交換的相關內容。WCF服務元數據究竟是什么?為什么WCF服務要暴露元數據交換節點?這些和以前的Web Service有什么關系?WCF服務元數據交換的方式有那些?我們如何實現WCF服務元數據交換,本節我們會詳細講解。全文結構如下:【1】WCF服務元數據的基本概念、【2】WCF服務元數據交換方式介紹【3】WCF服務元數據交換配置實現過程詳解【4】WCF服務元數據交換編程實現過程詳解【5】總結。

      【1】WCF服務元數據的基本概念:

          WCF服務元數據究竟是什么?它的作用是什么?為什么WCF服務要暴露元數據交換節點?這些和以前的Web Service有什么關系?這些通常是我們在學習WCF服務分布式系統開發過程中常常困擾我們的問題。

           【1.1】WCF服務元數據是什么:

          WCF服務元數據是WCF服務的核心部分服務地址(Address)、綁定(通信協議Binding)、契約(服務、操作、數據Contract)的原始描述信息。服務所公開的元數據包括 XSD(文檔中出現的元素、文檔中出現的屬性、子元素、子元素的數量、子元素的順序、元素是否為空、元素和屬性的數據類型、元素或屬性的默認和固定值)和 WSDL 文檔(用于描述服務的方法、參數、參數個數、順序、返回值、返回值的類型等方法的相關信息)。.Disco文檔(描述服務的協議、地址、命名空間等信息)。

          這些關鍵的WCF服務元數據全部都是基于XML語言描述,支持核心的行業標準協議。XSD好處顯而易見,  基于XML,沒有專門的語法 ,XML Schema支持一系列的數據類型(int、float、Boolean、date等) ,可擴充的數據模型,支持綜合命名空間 ,支持屬性組等。而這些正式WCF分布式服務追求的跨語言、跨平臺的關鍵部分所在。

          【1.2】為什么要暴露服務元數據:

           知道了WCF服務元數據的概念后,我們就能理解為什么要暴露服務的元數據。WCF服務的元數據描述服務的核心信息,客戶端需要了解這些特征以便與該服務進行通信。要想實現異構平臺或者系統之間的通信,以前的技術是使用Web Service.因為其具有自描述、可擴展、與平臺無關等優勢。客戶端只需要根據Web Service地址,便可獲取服務的相關信息,反序列話本地的代碼,通過服務代理進行服務的調用。

         WCF服務主要特性之一就是跨平臺的服務交互。而暴露服務元數據的重要原因就是解決了異構客戶端服務交互的關鍵問題。 元數據基于XML,自描述??蛻舳丝梢愿鶕盏脑獢祿葱蛄袚Q生成本地代碼,無論是c#,vb還是java語。

         【1.3】WCF的服務和Web Service比較:

           WCF其中一個重要特性就是支持Web Service的核心協議。無論是服務應用程序還是實際項目中客戶端服務的引用的代碼都能看出很多相似之處。這里線來看看服務程序的代碼結構(IIS托管為例)。

         

        兩者除了包括自己的擴展文件外還有與其對應的服務代碼文件。

      再來看看客戶端引用服務后本地的代碼結構。首先是Web Service客戶端的服務引用的本地文件:

      其次是WCF客戶端服務引用的文件結構:

      兩者都包括服務的本地代碼文件(反序列化生成的本地服務相關代碼),WSDL服務描述文件、XSD服務結構文件。WCF框架模型一定程度上參考了以前的ASP.NET Web Service,并對此進行了擴展。

      【2】WCF服務元數據交換方式介紹:

            WCF服務有兩種方案可以發布自己的元數據。一種是基于HTTP-GET協議提供元數據;另一種則為MEX終結點元數據交換方式,和WCF服務一樣使用一個專門的終結點,稱為MEX元數據交換終結點。

            System.ServiceModel.Description命名空間里MetadataExchangeClientMode枚舉類型里進行了定義。代碼如下:

      復制代碼
      using System;

      namespace System.ServiceModel.Description
      {
          // Summary:
          //     Specifies the exchange mode used to obtain metadata.
          public enum MetadataExchangeClientMode
          {
              // Summary:
              //     A WS-Transfer Get request is used.
              MetadataExchange = 0,
              //
              // Summary:
              //     An HTTP GET request is used.
              HttpGet = 1,
          }
      }
      復制代碼

         元數據交換終結點與其它終結點相似,包含自己的地址(Address)、綁定(通信協議Binding)、契約(服務、操作、數據Contract),但是使用的服務契約為WCF提供的接口IMetadataExchange。兩種發布元數據的方式使用了兩種不同的標準網絡傳輸協議,前者為HTTP/GET請求,后者為WS-MetadataExchange(MEX:WCF支持的基本綁定HTTP、HTTPS、TCP、IPC等綁定協議)。

          啟用元數據交換服務后,必須顯式配置元數據交換行為。下面我們來分別詳細介紹WCF服務元數據交換配置和編程兩種方式的實現過程。

      【3】WCF服務元數據交換配置實現過程詳解:

          【3.1】配置HTTP-GET元數據交換方式:

          需要配置服務的行為和基地址,客戶端可以根據基地址查看服務的元數據。代碼如下:

      復制代碼
            <service name="WcfServiceApp.WCFService" behaviorConfiguration="WcfServiceApp.WCFServiceBehavior">
                      <host>
                <baseAddresses>
                  <add baseAddress="http://localhost:8001/"/>
                </baseAddresses>
              </host>
            </service>
          </services>
          <behaviors>
            <serviceBehaviors>
              <behavior name="WcfServiceApp.WCFServiceBehavior">
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true"/>
                <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="false"/>
              </behavior>
            </serviceBehaviors>
          </behaviors>
      復制代碼

         配置完成以后,我們可以使用基地址在瀏覽器里查看服務的信息,效果如下圖:

         

           【3.2】配置終結點元數據交換方式:

            我們這里配置了3種方式的元數據交換終結點,分別是HTTP、TCP、IPC方式。具體代碼如下:

      復制代碼
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
              <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
              <endpoint address="mex" binding="mexNamedPipeBinding" contract="IMetadataExchange" />
              <host>
                <baseAddresses>
                  <add baseAddress="http://localhost:8001/"/>
                  <add baseAddress="net.tcp://localhost:8002/"/>
                  <add baseAddress="net.pipe://localhost/"/>
                </baseAddresses>
              </host>
      服務行為:
      <serviceBehaviors>
              <behavior name="WCFService.WCFServiceBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
              </behavior>
            </serviceBehaviors>
          </behaviors>
      復制代碼

       

      【4】WCF服務元數據交換編程實現過程詳解:

          以上的配置文件實現的WCF服務的元數據交換,同樣我們也可以通過編程方式實現。前者配置簡單、快捷,后者相對復雜。但是編程方式允許代碼運行時控制或者設置元數據交換的信息。因而更加靈活。下面我們就來看看如何通過代碼實現剛才的服務原數據交換的配置。

      【4.1】WCF服務元數據交換HTTP-GET編程實現:

         必須添加對命名空間的引用, using System.ServiceModel.Description;我們對服務元數據操作的類和接口信息定義在此命名空間里,具體的實現HTTP-GET的代碼如下:

      復制代碼
       ServiceMetadataBehavior metadataBehavior;//定義服務行為變量,
                      metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
                      //獲取宿主的行為列表
                      if (metadataBehavior == null)//如果沒有服務原數據交換的行為,實例化添加服務原數據交換行為
                      {
                          metadataBehavior = new ServiceMetadataBehavior();
                          Uri httpAddress = new Uri("http://localhost:8001/");
                          metadataBehavior.HttpGetUrl =httpAddress;
                          metadataBehavior.HttpGetEnabled = true;//設置HTTP方式
                          host.Description.Behaviors.Add(metadataBehavior);
                      }
      復制代碼

       

         首先是獲得服務行為的列表信息,如果沒有設置,我們就進行實例化服務原數據交換行為,并設置http方式可用。 host.Description.Behaviors.Add(metadataBehavior);添加宿主服務的行為。

      【4.2】WCF服務元數據交換WS-*編程實現:

          這里分別實現了HTTP、TCP、IPC三種方式的的元數據交換的代碼。和http-get方式略有不同,我們需要實例化自己綁定元素和綁定,最后作為參數傳遞給host宿主實例。具體實現代碼如下:

      復制代碼
      //2編程方式實現ws*原數據交換
                      //生命三個綁定節點類
                      BindingElement tcpBindingElement = new TcpTransportBindingElement();
                      BindingElement httpBindingElement = new HttpsTransportBindingElement();
                      BindingElement pipeBindingElement = new NamedPipeTransportBindingElement();
                      //實例化通用綁定類的實例
                      Binding tcpBinding = new CustomBinding(tcpBindingElement);
                      Binding httpBinding = new CustomBinding(httpBindingElement);
                      Binding pipeBinding = new CustomBinding(pipeBindingElement);
                      //
                      Uri tcpBaseAddress = new Uri("net.tcp://localhost:9001/");
                      Uri httpBaseAddress = new Uri("http://localhost:9002/");
                      Uri pipeBaseAddress = new Uri("net.pipe://localhost/");
                      host.AddServiceEndpoint(typeof(WCFService.IWCFService), new NetTcpBinding(), tcpBaseAddress);
                      host.AddServiceEndpoint(typeof(WCFService.IWCFService), new WSHttpBinding(), httpBaseAddress);
                      host.AddServiceEndpoint(typeof(WCFService.IWCFService), new NetNamedPipeBinding(), pipeBaseAddress);
                      
                      //ServiceMetadataBehavior metadataBehavior;//定義服務行為變量,
                      metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
                      //獲取宿主的行為列表
                      if (metadataBehavior == null)//如果沒有服務原數據交換的行為,實例化添加服務原數據交換行為
                      {
                          metadataBehavior = new ServiceMetadataBehavior();

                          host.Description.Behaviors.Add(metadataBehavior);
                      }
                      //如果沒有可用的mex節點,可以使用一下代碼判斷,添加mex節點
                      
                      host.AddServiceEndpoint(typeof(IMetadataExchange), tcpBinding, "mex");
                      host.AddServiceEndpoint(typeof(IMetadataExchange), httpBinding, "mex");
                      host.AddServiceEndpoint(typeof(IMetadataExchange), pipeBinding, "mex");
      復制代碼

       

      【5】總結:

          運行宿主程序,客戶端添加服務引用,使用不同元數據地址,我們可以查詢到不同的服務信息。結果如下:

       【5.1】http-get方式:

       

      【5.1】終結點http方式:

       

      【5.1】終結點tcp方式:

       

      【5.1】終結點ipc方式:

         

      【5.5】結論

           以上就是全部是WCF服務元數據交換相關概念、配置和編程實現http-get及WS-*等協議進行元數據交換的詳細內容。元數據的信息除了包括服務、數據、操作等契約的相關的信息外,還有其他的如事物、可靠性、錯誤處理等相關的信息。

          了解了這些實現過程之后,在實際的WCF服務項目中,我們就可以以不同的方式配置元數據交換方式。WCF元數據交換其實和Web Service原數據交換有類似之處,都是基于XML語言描述,原數據交換之所以這樣重要。

          首先,基于XML的元數據可以實現跨語言、跨平臺之間的服務交互,真正做到與平臺的無關性。

          其次,通過原數據反序列化生成本地代理類等信息,因為這樣就實現了真正的客戶端和服務端的解耦,降低了系統之間的耦合度。傳統的程序集引用方式無法降低系統的耦合度,這個也是我們系統設計追求的目標。

          以上就是WCF服務元數據交互的全部內容,下面上傳本節的實例代碼:

      /Files/frank_xl/WCFServiceMEXFrankXuLei.rar。供大家參考,也歡迎留言討論~

      posted @ 2016-08-09 11:26  閆寶平  閱讀(377)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧美精品一区二区在线观看播放| 国语做受对白XXXXX在线| 亚洲第一无码AV无码专区| 亚洲高清WWW色好看美女| 欧美牲交videossexeso欧美 | 无码粉嫩虎白一线天在线观看| 内射无套内射国产精品视频| 国产精品中文字幕观看| 国产睡熟迷奷系列网站| 中国熟妇毛多多裸交视频| 监利县| 少妇无码av无码专区在线观看| 日韩V欧美V中文在线| 山西省| 国产亚洲精品在av| 欧美啪啪网| 国产日韩av二区三区| 亚洲人成网站在小说| 少妇高潮喷潮久久久影院| 国产亚洲精品久久久久秋霞| 久久精品国产99久久丝袜| 区一区二区三区中文字幕| 9999国产精品欧美久久久久久| 亚洲肥熟女一区二区三区| 日本一区二区三区专线| 99久久精品国产一区二区蜜芽| 国产va免费精品观看| 亚洲精品国产一区二区在线观看| 粉嫩av蜜臀一区二区三区| 亚洲无线一二三四区手机| 激情国产一区二区三区四区| 四虎永久精品免费视频| 国产精品日日摸夜夜添夜夜添无码| 国产一精品一av一免费爽爽| 日韩内射美女人妻一区二区三区| 久久精品国产亚洲av品| 成年女人免费碰碰视频| 国产精品视频亚洲二区| 中文字幕国产精品第一页| 国产老头多毛Gay老年男| 一本高清码二区三区不卡|