|
今天我們繼續(xù)WCF分布式開(kāi)發(fā)步步為贏(3)WCF服務(wù)元數(shù)據(jù)交換、配置及編程開(kāi)發(fā)的學(xué)習(xí)。經(jīng)過(guò)前面兩節(jié)的學(xué)習(xí),我們了解WCF分布式開(kāi)發(fā)的相關(guān)的基本的概念和自定義宿主托管服務(wù)的完整的開(kāi)發(fā)和配置過(guò)程。今天我們來(lái)詳細(xì)學(xué)習(xí)WCF服務(wù)元數(shù)據(jù)交換的相關(guān)內(nèi)容。WCF服務(wù)元數(shù)據(jù)究竟是什么?為什么WCF服務(wù)要暴露元數(shù)據(jù)交換節(jié)點(diǎn)?這些和以前的Web Service有什么關(guān)系?WCF服務(wù)元數(shù)據(jù)交換的方式有那些?我們?nèi)绾螌?shí)現(xiàn)WCF服務(wù)元數(shù)據(jù)交換,本節(jié)我們會(huì)詳細(xì)講解。全文結(jié)構(gòu)如下:【1】WCF服務(wù)元數(shù)據(jù)的基本概念、【2】WCF服務(wù)元數(shù)據(jù)交換方式介紹【3】WCF服務(wù)元數(shù)據(jù)交換配置實(shí)現(xiàn)過(guò)程詳解【4】WCF服務(wù)元數(shù)據(jù)交換編程實(shí)現(xiàn)過(guò)程詳解【5】總結(jié)。
【1】WCF服務(wù)元數(shù)據(jù)的基本概念:
WCF服務(wù)元數(shù)據(jù)究竟是什么?它的作用是什么?為什么WCF服務(wù)要暴露元數(shù)據(jù)交換節(jié)點(diǎn)?這些和以前的Web Service有什么關(guān)系?這些通常是我們?cè)趯W(xué)習(xí)WCF服務(wù)分布式系統(tǒng)開(kāi)發(fā)過(guò)程中常常困擾我們的問(wèn)題。
【1.1】WCF服務(wù)元數(shù)據(jù)是什么:
WCF服務(wù)元數(shù)據(jù)是WCF服務(wù)的核心部分服務(wù)地址(Address)、綁定(通信協(xié)議Binding)、契約(服務(wù)、操作、數(shù)據(jù)Contract)的原始描述信息。服務(wù)所公開(kāi)的元數(shù)據(jù)包括 XSD(文檔中出現(xiàn)的元素、文檔中出現(xiàn)的屬性、子元素、子元素的數(shù)量、子元素的順序、元素是否為空、元素和屬性的數(shù)據(jù)類型、元素或?qū)傩缘哪J(rèn)和固定值)和 WSDL 文檔(用于描述服務(wù)的方法、參數(shù)、參數(shù)個(gè)數(shù)、順序、返回值、返回值的類型等方法的相關(guān)信息)。.Disco文檔(描述服務(wù)的協(xié)議、地址、命名空間等信息)。
這些關(guān)鍵的WCF服務(wù)元數(shù)據(jù)全部都是基于XML語(yǔ)言描述,支持核心的行業(yè)標(biāo)準(zhǔn)協(xié)議。XSD好處顯而易見(jiàn), 基于XML,沒(méi)有專門的語(yǔ)法 ,XML Schema支持一系列的數(shù)據(jù)類型(int、float、Boolean、date等) ,可擴(kuò)充的數(shù)據(jù)模型,支持綜合命名空間 ,支持屬性組等。而這些正式WCF分布式服務(wù)追求的跨語(yǔ)言、跨平臺(tái)的關(guān)鍵部分所在。
【1.2】為什么要暴露服務(wù)元數(shù)據(jù):
知道了WCF服務(wù)元數(shù)據(jù)的概念后,我們就能理解為什么要暴露服務(wù)的元數(shù)據(jù)。WCF服務(wù)的元數(shù)據(jù)描述服務(wù)的核心信息,客戶端需要了解這些特征以便與該服務(wù)進(jìn)行通信。要想實(shí)現(xiàn)異構(gòu)平臺(tái)或者系統(tǒng)之間的通信,以前的技術(shù)是使用Web Service。因?yàn)槠渚哂凶悦枋觥⒖蓴U(kuò)展、與平臺(tái)無(wú)關(guān)等優(yōu)勢(shì)。客戶端只需要根據(jù)Web Service地址,便可獲取服務(wù)的相關(guān)信息,反序列話本地的代碼,通過(guò)服務(wù)代理進(jìn)行服務(wù)的調(diào)用。
WCF服務(wù)主要特性之一就是跨平臺(tái)的服務(wù)交互。而暴露服務(wù)元數(shù)據(jù)的重要原因就是解決了異構(gòu)客戶端服務(wù)交互的關(guān)鍵問(wèn)題。 元數(shù)據(jù)基于XML,自描述。客戶端可以根據(jù)服務(wù)的元數(shù)據(jù)反序列換生成本地代碼,無(wú)論是c#,vb還是Java語(yǔ)。
【1.3】WCF的服務(wù)和Web Service比較:
WCF其中一個(gè)重要特性就是支持Web Service的核心協(xié)議。無(wú)論是服務(wù)應(yīng)用程序還是實(shí)際項(xiàng)目中客戶端服務(wù)的引用的代碼都能看出很多相似之處。這里線來(lái)看看服務(wù)程序的代碼結(jié)構(gòu)(IIS托管為例)。
兩者除了包括自己的擴(kuò)展文件外還有與其對(duì)應(yīng)的服務(wù)代碼文件。
再來(lái)看看客戶端引用服務(wù)后本地的代碼結(jié)構(gòu)。首先是Web Service客戶端的服務(wù)引用的本地文件:
其次是WCF客戶端服務(wù)引用的文件結(jié)構(gòu):
兩者都包括服務(wù)的本地代碼文件(反序列化生成的本地服務(wù)相關(guān)代碼),WSDL服務(wù)描述文件、XSD服務(wù)結(jié)構(gòu)文件。WCF框架模型一定程度上參考了以前的ASP.NET Web Service,并對(duì)此進(jìn)行了擴(kuò)展。
【2】WCF服務(wù)元數(shù)據(jù)交換方式介紹:
WCF服務(wù)有兩種方案可以發(fā)布自己的元數(shù)據(jù)。一種是基于HTTP-GET協(xié)議提供元數(shù)據(jù);另一種則為MEX終結(jié)點(diǎn)元數(shù)據(jù)交換方式,和WCF服務(wù)一樣使用一個(gè)專門的終結(jié)點(diǎn),稱為MEX元數(shù)據(jù)交換終結(jié)點(diǎn)。
System.ServiceModel.Description命名空間里MetadataExchangeClientMode枚舉類型里進(jìn)行了定義。代碼如下:
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,
}
}【3】WCF服務(wù)元數(shù)據(jù)交換配置實(shí)現(xiàn)過(guò)程詳解:
【3.1】配置HTTP-GET元數(shù)據(jù)交換方式:
需要配置服務(wù)的行為和基地址,客戶端可以根據(jù)基地址查看服務(wù)的元數(shù)據(jù)。代碼如下:
<service name="WcfServiceApp.WCFService" behaviorConfiguration="WcfServiceApp.WCFServiceBehavior"><host>
<baseAddresses>
<add baseAddress="http://localhost:8001/"/>
baseAddresses>
host>
service>
services>
<behaviors>
<serviceBehaviors>
<behavior name="WcfServiceApp.WCFServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
behavior>
serviceBehaviors>
behaviors>【4】WCF服務(wù)元數(shù)據(jù)交換編程實(shí)現(xiàn)過(guò)程詳解:
以上的配置文件實(shí)現(xiàn)的WCF服務(wù)的元數(shù)據(jù)交換,同樣我們也可以通過(guò)編程方式實(shí)現(xiàn)。前者配置簡(jiǎn)單、快捷,后者相對(duì)復(fù)雜。但是編程方式允許代碼運(yùn)行時(shí)控制或者設(shè)置元數(shù)據(jù)交換的信息。因而更加靈活。下面我們就來(lái)看看如何通過(guò)代碼實(shí)現(xiàn)剛才的服務(wù)原數(shù)據(jù)交換的配置。
【4.1】WCF服務(wù)元數(shù)據(jù)交換HTTP-GET編程實(shí)現(xiàn):
必須添加對(duì)命名空間的引用, using System.ServiceModel.Description;我們對(duì)服務(wù)元數(shù)據(jù)操作的類和接口信息定義在此命名空間里,具體的實(shí)現(xiàn)HTTP-GET的代碼如下:
ServiceMetadataBehavior metadataBehavior;//定義服務(wù)行為變量,metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
//獲取宿主的行為列表
if (metadataBehavior == null)//如果沒(méi)有服務(wù)原數(shù)據(jù)交換的行為,實(shí)例化添加服務(wù)原數(shù)據(jù)交換行為
{
metadataBehavior = new ServiceMetadataBehavior();
Uri httpAddress = new Uri("http://localhost:8001/");
metadataBehavior.HttpGetUrl =httpAddress;
metadataBehavior.HttpGetEnabled = true;//設(shè)置HTTP方式
host.Description.Behaviors.Add(metadataBehavior);
}【5】總結(jié):
運(yùn)行宿主程序,客戶端添加服務(wù)引用,使用不同元數(shù)據(jù)地址,我們可以查詢到不同的服務(wù)信息。結(jié)果如下:
【5.1】http-get方式:
【5.1】終結(jié)點(diǎn)http方式:
【5.1】終結(jié)點(diǎn)tcp方式:
【5.1】終結(jié)點(diǎn)ipc方式:
【5.5】結(jié)論
以上就是全部是WCF服務(wù)元數(shù)據(jù)交換相關(guān)概念、配置和編程實(shí)現(xiàn)http-get及WS-*等協(xié)議進(jìn)行元數(shù)據(jù)交換的詳細(xì)內(nèi)容。元數(shù)據(jù)的信息除了包括服務(wù)、數(shù)據(jù)、操作等契約的相關(guān)的信息外,還有其他的如事物、可靠性、錯(cuò)誤處理等相關(guān)的信息。
了解了這些實(shí)現(xiàn)過(guò)程之后,在實(shí)際的WCF服務(wù)項(xiàng)目中,我們就可以以不同的方式配置元數(shù)據(jù)交換方式。WCF元數(shù)據(jù)交換其實(shí)和Web Service原數(shù)據(jù)交換有類似之處,都是基于XML語(yǔ)言描述,原數(shù)據(jù)交換之所以這樣重要。
首先,基于XML的元數(shù)據(jù)可以實(shí)現(xiàn)跨語(yǔ)言、跨平臺(tái)之間的服務(wù)交互,真正做到與平臺(tái)的無(wú)關(guān)性。
其次,通過(guò)原數(shù)據(jù)反序列化生成本地代理類等信息,因?yàn)檫@樣就實(shí)現(xiàn)了真正的客戶端和服務(wù)端的解耦,降低了系統(tǒng)之間的耦合度。傳統(tǒng)的程序集引用方式無(wú)法降低系統(tǒng)的耦合度,這個(gè)也是我們系統(tǒng)設(shè)計(jì)追求的目標(biāo)。
以上就是WCF服務(wù)元數(shù)據(jù)交互的全部?jī)?nèi)容,下面上傳本節(jié)的實(shí)例代碼:
/Files/frank_xl/WCFServiceMEXFrankXuLei.rar。供大家參考,也歡迎留言討論~
參考資料:MSDN
【老徐的博客】
【作者】:Frank Xu Lei
【地址】:http://www.cnblogs.com/frank_xl/archive/2009/03/25/1421862.html
NET技術(shù):WCF分布式開(kāi)發(fā)步步為贏(3)WCF服務(wù)元數(shù)據(jù)交換、配置及編程開(kāi)發(fā),轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。