程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WCF分布式開發步步為贏(3)WCF服務元數據交換、配置及編程開發

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

編輯:關於.NET

今天我們繼續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,自描述。客戶端可以根據服務的元數據反序列換生成本地代碼,無論是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的代碼如下:

【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服務元數據交互的全部內容

文章來源:http://www.cnblogs.com/frank_xl/

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved