久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

WinVista新技術(shù) WCF開(kāi)發(fā)指南之構(gòu)建服務(wù)

瀏覽:132日期:2023-08-07 14:05:48

作者:朱先忠編譯

一. 引言Windows通訊基礎(chǔ)(簡(jiǎn)稱(chēng)為WCF)是一種SDK,用于讓你使用典型的CLR編程結(jié)構(gòu)(例如用于發(fā)布和消費(fèi)服務(wù)的類(lèi)和接口等)來(lái)構(gòu)建Windows面向服務(wù)的應(yīng)用程序。WCF的編程模型是聲明性的并且大部分是屬性驅(qū)動(dòng)的。WCF為通訊服務(wù)提供了一種運(yùn)行時(shí)刻環(huán)境,使你能夠把CLR類(lèi)型暴露為服務(wù)并且以CLR類(lèi)型來(lái)消費(fèi)服務(wù)。盡管在理論上你可以不用WCF來(lái)構(gòu)建服務(wù);但是,在實(shí)踐中,WCF能夠顯著地簡(jiǎn)化這一任務(wù)。WCF是微軟的一組工業(yè)標(biāo)準(zhǔn)的實(shí)現(xiàn),該標(biāo)準(zhǔn)定義了服務(wù)交互、類(lèi)型轉(zhuǎn)化、編排和多種協(xié)議的管理。因此,WCF提供了服務(wù)間的互操作性并且提高了開(kāi)發(fā)效率(包括幾乎任何應(yīng)用程序所要求實(shí)現(xiàn)的基本的常規(guī)的繁重任務(wù))。本文將描述WCF塊及其架構(gòu)的基本概念和構(gòu)建,從而使你能夠構(gòu)建簡(jiǎn)單的服務(wù)。二. 什么是WCF服務(wù)?一個(gè)服務(wù)是一個(gè)暴露給外界的功能單元。從編程模型的發(fā)展歷史來(lái)說(shuō),它經(jīng)歷了從函數(shù)到對(duì)象再到組件最后到服務(wù)的過(guò)程;而WCF服務(wù)正代表了下一代的革命性的Windows編程模型。面向服務(wù)(SO)是一組原則的抽象集和針對(duì)于構(gòu)建SO應(yīng)用程序的最好實(shí)踐,但這其中的一大部分已經(jīng)超出了本文的范圍。一個(gè)面向服務(wù)的應(yīng)用程序(SOA)把服務(wù)聚合成單個(gè)邏輯的應(yīng)用程序(見(jiàn)圖1),這類(lèi)似于一個(gè)面向組件的應(yīng)用程序聚合組件或一個(gè)面向?qū)ο蟮膽?yīng)用程序聚合對(duì)象的方式。服務(wù)可以是本地的也可以是遠(yuǎn)程的,可以由多種團(tuán)隊(duì)使用任何技術(shù)開(kāi)發(fā)而成,它們可以被獨(dú)立地進(jìn)行版本化管理,甚至可以在不同的時(shí)間進(jìn)度上執(zhí)行。在一個(gè)服務(wù)內(nèi)部,你可以使用例如語(yǔ)言,技術(shù),平臺(tái),版本和框架等概念;然而,在服務(wù)之間,只允許使用規(guī)定的通訊模式。 圖1:一個(gè)面向服務(wù)的應(yīng)用程序的框架。客戶端通過(guò)發(fā)送和接收消息與服務(wù)進(jìn)行交互。消息可以從客戶端直接或經(jīng)中介傳輸?shù)椒?wù)。在WCF中,所有的消息都是SOAP消息。注意,這些消息獨(dú)立于傳輸協(xié)議——不象Web服務(wù),WCF服務(wù)可以通過(guò)多種傳輸協(xié)議進(jìn)行通訊,而不僅是HTTP。在WCF中,客戶端從不直接與服務(wù)進(jìn)行交互,即使在當(dāng)處理一個(gè)本地的內(nèi)存中服務(wù)時(shí)。而是,客戶端總是使用一個(gè)代理來(lái)把該調(diào)用轉(zhuǎn)發(fā)給服務(wù)。WCF允許客戶端跨越所有執(zhí)行邊界與服務(wù)進(jìn)行通訊。在同一臺(tái)計(jì)算機(jī)上(見(jiàn)圖2),客戶端可以跨越同一進(jìn)程中的應(yīng)用程序域或進(jìn)程來(lái)消費(fèi)同一個(gè)應(yīng)用程序域中的服務(wù)。通過(guò)跨越計(jì)算機(jī)邊界(圖3),客戶端能夠在企業(yè)內(nèi)網(wǎng)或跨越因特網(wǎng)與服務(wù)進(jìn)行交互。圖3.跨機(jī)器通訊:這里是一個(gè)跨機(jī)器使用WCF通訊的例子。圖2.使用WCF在同一臺(tái)機(jī)器上通訊。因?yàn)樗械慕换ナ墙?jīng)由一個(gè)代理實(shí)現(xiàn)的,所以對(duì)于本地和遠(yuǎn)程情況下,WCF保持相同的編程模型,這樣以來(lái)不僅能夠使你進(jìn)行位置切換而不影響客戶端,而且顯著地簡(jiǎn)化應(yīng)用程序編程模型。大多數(shù)WCF功能被包括到位于System.ServiceModel命名空間的單個(gè)的程序集System.ServiceModel.dll中。三. 服務(wù)地址在WCF中,每一個(gè)服務(wù)都與唯一一個(gè)地址相聯(lián)系。該地址提供了兩個(gè)重要的元素:服務(wù)的位置和用于與服務(wù)進(jìn)行通訊的傳輸協(xié)議。地址的位置部分指出目標(biāo)計(jì)算機(jī)名,站點(diǎn)或網(wǎng)絡(luò),一個(gè)通訊端口,管道或隊(duì)列,還有一個(gè)可選的特定的路徑或URI。至于傳輸,WCF 1.0支持下列:· HTTP· TCP· 端對(duì)端網(wǎng)絡(luò)· IPC(通過(guò)命名管道進(jìn)行的進(jìn)程間通訊)· MSMQ地址總是使用如下格式:[base address]/[optional URI]其中,基地址總是使用如下格式:[transport]://[Machine or domain][:optional port]下面是一些可能的服務(wù)地址:http://localhost:8001http://localhost:8001/MyServicenet.tcp://localhost:8002/MyServicenet.pipe://localhost/MyPipenet.msmq://localhost/private/MyService

四. 服務(wù)合同在WCF中,所有的服務(wù)都暴露合同。合同是一種描述服務(wù)所實(shí)現(xiàn)功能的平臺(tái)中立的標(biāo)準(zhǔn)的方式。WCF定義了四種類(lèi)型的合同:· 服務(wù)合同描述你可以在服務(wù)上執(zhí)行哪些操作。· 數(shù)據(jù)合同定義哪些數(shù)據(jù)類(lèi)型被傳入和傳出服務(wù)。WCF為內(nèi)置類(lèi)型定義隱式合同,例如int和string,但是你可以容易地為定制類(lèi)型定義顯式的選入式數(shù)據(jù)合同。· 錯(cuò)誤合同定義哪些錯(cuò)誤將被該服務(wù)所激發(fā),以及該服務(wù)怎樣處理錯(cuò)誤信息和把如何把它們傳播到客戶端。· 消息合同允許服務(wù)直接與消息進(jìn)行交互。消息合同可以被類(lèi)型化或非類(lèi)型化,并且有點(diǎn)類(lèi)似于CLR中的遲綁定調(diào)用。不過(guò),消息合同很少為SOA開(kāi)發(fā)者所用。在這4種類(lèi)型的合同中,本文將集中討論服務(wù)合同。你可以使用ServiceContractAttribute來(lái)定義一個(gè)服務(wù)合同,并且你可以把該屬性應(yīng)用于一個(gè)接口或一個(gè)類(lèi),如列表1(見(jiàn)本文相應(yīng)下載源碼)所示。服務(wù)合同獨(dú)立于接口或類(lèi)可見(jiàn)性-公共或內(nèi)部可見(jiàn)性是一個(gè)CLR概念,而不是WCF概念。在一個(gè)內(nèi)部接口上應(yīng)用ServiceContractAttribute將把該接口暴露為一個(gè)公共服務(wù)合同(可以跨越服務(wù)邊界進(jìn)行消費(fèi))。沒(méi)有ServiceContractAttribute的話,該接口對(duì)WCF客戶端是不可見(jiàn)的,這與面向服務(wù)的宗旨一致(服務(wù)邊界是顯式的)。為了強(qiáng)制實(shí)現(xiàn)這一點(diǎn),所有的合同必須是嚴(yán)格選入的。OperationContractAttribute僅能被應(yīng)用到方法(而不是屬性,索引器或事件,這都是一些CLR概念)中。OperationContractAttribute把一個(gè)合同方法暴露為在服務(wù)合同上執(zhí)行的一種邏輯操作。該接口上的其它不具有OperationContractAttribute屬性的方法不會(huì)成為合同的一部分。這可以強(qiáng)制實(shí)現(xiàn)顯式的服務(wù)邊界,并且,對(duì)于操作本身來(lái)說(shuō),保持一種選入模型。注意,合同操作獨(dú)立于方法可見(jiàn)性。列表1展示了通過(guò)定義一個(gè)合同接口把服務(wù)合同與其實(shí)現(xiàn)分離開(kāi)來(lái)的最好應(yīng)用。另外,你還可以直接把ServiceContractAttribute和OperationContractAttribute應(yīng)用于類(lèi),在這種情況下,WCF使用OperationContractAttribute從類(lèi)中推斷出一個(gè)服務(wù)合同和方法。這是一種應(yīng)該盡量避免使用的技術(shù): //盡量避免使用[ServiceContract]class MyService{ [OperationContract] //可見(jiàn)性并不要緊 string MyMethod(string text) {return 'Hello ' + text; } public string MyOtherMethod(string text) {return 'Cannot call this method over WCF'; }}這個(gè)ServiceContractAttribute把CLR接口(或推斷的接口)映射到一個(gè)技術(shù)中立的WCF合同上。通過(guò)派生和實(shí)現(xiàn)多個(gè)帶有ServiceContractAttribute的接口,單個(gè)類(lèi)可以支持多個(gè)合同。類(lèi)能夠通過(guò)隱式或顯式方式實(shí)現(xiàn)這個(gè)接口,因?yàn)樵摲椒梢?jiàn)性對(duì)WCF沒(méi)有任何影響。然而,存在許多實(shí)現(xiàn)約束:避免使用參數(shù)化的構(gòu)造器,因?yàn)閃CF僅使用默認(rèn)的構(gòu)造器。盡管該類(lèi)能夠使用內(nèi)部屬性,索引器和靜態(tài)成員,但是沒(méi)有WCF客戶端能夠存取它們。五. 宿主每個(gè)WCF服務(wù)必須宿主在一個(gè)Windows進(jìn)程中(稱(chēng)為宿主進(jìn)程)。單個(gè)宿主進(jìn)程可以宿主多個(gè)服務(wù),而相同的服務(wù)類(lèi)型可以宿主在多個(gè)進(jìn)程中。WCF并不要求是否該宿主進(jìn)程也是客戶端進(jìn)程。顯然,應(yīng)該有一個(gè)獨(dú)立的進(jìn)程支持錯(cuò)誤和安全的隔離。另外,誰(shuí)提供進(jìn)程或調(diào)用哪種類(lèi)型的進(jìn)程都不是實(shí)質(zhì)性的問(wèn)題。這個(gè)宿主可以由IIS或Windows Vista中的Widows活動(dòng)服務(wù)(WAS)或由開(kāi)發(fā)者作為應(yīng)用程序的一部分來(lái)提供。六. IIS宿主在IIS中宿主一個(gè)服務(wù)的主要優(yōu)點(diǎn)是,在發(fā)生客戶端請(qǐng)求時(shí)宿主進(jìn)程會(huì)被自動(dòng)啟動(dòng),并且你可以依靠IIS來(lái)管理宿主進(jìn)程的生命周期。IIS宿主的主要不利在于,你僅僅可以在IIS5和IIS6上使用HTTP傳輸數(shù)據(jù);而且當(dāng)使用IIS5時(shí),你僅可以使用80端口。在IIS上宿主非常類(lèi)似于宿主一個(gè)典型的ASMX Web服務(wù)。你需要在IIS下創(chuàng)建一個(gè)虛擬的目錄并且提供一個(gè).svc文件。這個(gè).svc文件的功能就象一個(gè)被用來(lái)標(biāo)識(shí)服務(wù)的code-behind文件和類(lèi)的.asmx文件一樣。<%@ ServiceHost Language = 'C#' Debug = 'true'CodeBehind = '~/App_Code/MyService.cs'Service = 'MyService'%>你甚至可以把服務(wù)代碼以內(nèi)聯(lián)方式注入到.svc文件中,但是不建議這樣用(就象對(duì)于ASMX的情形一樣)。一旦你準(zhǔn)備好了.svc文件,你就可以使用一個(gè)瀏覽器來(lái)觀看它。如果一切順利,那么你將得到一個(gè)確認(rèn)頁(yè)面。Visual Studio 2005能夠?yàn)槟闵梢粋€(gè)新的IIS宿主的服務(wù)。這只要從File菜單下選擇'New Website',然后從'New Web Site'對(duì)話框中選擇WinFX服務(wù)。這使得Visual Studio 2005創(chuàng)建一個(gè)新的Web站點(diǎn),服務(wù)代碼和匹配的.svc文件。另外,Web站點(diǎn)配置文件必須列舉出你想要暴露的服務(wù)類(lèi)型。你需要使用完全限定類(lèi)型名(包括程序集名),如果類(lèi)型來(lái)自于一個(gè)未引用的程序集的話。<system.serviceModel><services><service name='MyNamespace.MyService'>...</service></services></system.serviceModel>七. 自宿主自宿主是當(dāng)開(kāi)發(fā)者負(fù)責(zé)提供和管理宿主進(jìn)程的生命周期時(shí)使用的技術(shù)名詞。自宿主被應(yīng)用在位于客戶端和服務(wù)之間的一個(gè)進(jìn)程(或計(jì)算機(jī))邊界環(huán)境中,以及當(dāng)使用進(jìn)程中服務(wù)的情況下(也就是說(shuō),與客戶端處于相同的進(jìn)程中)。你需要提供的進(jìn)程可能是任何Windows進(jìn)程,例如,一個(gè)Windows表單應(yīng)用程序,一個(gè)控制臺(tái)應(yīng)用程序或一個(gè)Windows NT服務(wù)。注意,該進(jìn)程必須在客戶端調(diào)用服務(wù)之前先運(yùn)行起來(lái);典型情況下,這意味著,你必須預(yù)先啟動(dòng)它。對(duì)于NT進(jìn)程中服務(wù)來(lái)說(shuō)這并不是一個(gè)問(wèn)題。類(lèi)似于IIS宿主,宿主應(yīng)用程序配置文件必須列出你想宿主的服務(wù)的類(lèi)型并且暴露給外界。而且,該宿主進(jìn)程必須在運(yùn)行時(shí)刻顯式地注冊(cè)服務(wù)類(lèi)型并且打開(kāi)該宿主以便于客戶端調(diào)用。典型地,這是在Main()方法中使用如下定義的助理類(lèi)ServiceHost實(shí)現(xiàn)的:public interface ICommunicationObject : IDisposable{void Open();void Close();//更多成員}public abstract class CommunicationObject : ICommunicationObject{...}public class ServiceHostBase : CommunicationObject,...{...}public class ServiceHost : ServiceHostBase,...{public ServiceHost(Type serviceType,params Uri[]baseAddresses);//更多成員}提供給ServiceHost的構(gòu)造函數(shù)的信息有:服務(wù)類(lèi)型和(可選)默認(rèn)的基地址。該基地址集可以是一個(gè)空集(以后,你可以配置不同的基地址)。擁有一組基地址能夠使服務(wù)接受在多個(gè)地址和協(xié)議上的調(diào)用。注意,每個(gè)ServiceHost實(shí)例都關(guān)聯(lián)與一個(gè)特定的服務(wù)類(lèi)型,并且如果宿主進(jìn)程需要宿主多個(gè)類(lèi)型的服務(wù)的話,你需要一些匹配的ServiceHost實(shí)例。通過(guò)調(diào)用宿主中的ServiceHost.Open()方法,你允許調(diào)入(call-in);并且通過(guò)調(diào)用ServiceHost.Close()方法,你可以體面地退出宿主實(shí)例并完成到當(dāng)前客戶端的數(shù)據(jù)發(fā)送,并且還要拒絕未來(lái)的客戶端調(diào)用-即使宿主進(jìn)程仍在運(yùn)行中。典型地,關(guān)閉操作是在宿主進(jìn)程關(guān)閉時(shí)實(shí)現(xiàn)的。例如,為了把這個(gè)服務(wù)宿主在一個(gè)Windows表單應(yīng)用程序中:[ServiceContract]interface IMyContract{...}class MyService : IMyContract{...}你可以編寫(xiě):public static void Main(){Uri baseAddress = new Uri('http://localhost:8000/');ServiceHost serviceHost;serviceHost = new ServiceHost(typeof(MyService),baseAddress);serviceHost.Open();//能夠攔截調(diào)用:Application.Run(new MyForm());serviceHost.Close();}注意,你可以在調(diào)用ServiceHost.Open()之后攔截調(diào)用,因?yàn)樵撍拗鹘邮赵诠ぷ髡呔€程上的所有調(diào)用。對(duì)ServiceHost.Open()的調(diào)用將加載WCF運(yùn)行時(shí)刻并且支持接收客戶端調(diào)用。該宿主能注冊(cè)多個(gè)基地址,只要它們至少在傳輸方面存在不同:Uri tcpBaseAddress = new Uri('net.tcp://localhost:8001/');Uri httpBaseAddress = new Uri('http://localhost:8002/');ServiceHost serviceHost = new ServiceHost(typeof(MyService),tcpBaseAddress,httpBaseAddress);通過(guò)從'Add New Item'對(duì)話框中選擇WCF服務(wù),Visual Studio 2005允許你把一個(gè)WCF服務(wù)添加到任何應(yīng)用程序工程。以此方式添加的服務(wù)當(dāng)然是進(jìn)程中服務(wù)(相對(duì)于宿主進(jìn)程來(lái)說(shuō)),但是也可以由外部客戶端存取。

八. WAS宿主Windows活動(dòng)服務(wù)(WAS)是可用于Windows Vista中的一種系統(tǒng)服務(wù)。WAS是IIS7的一部分,但是可以被獨(dú)立地配置。為了使用WAS來(lái)宿主通訊WCF服務(wù),你需要提供一個(gè).svc文件。該WAS提供與IIS和自宿主相比更多的優(yōu)點(diǎn),包括空閑時(shí)間管理、標(biāo)識(shí)管理、應(yīng)用程序池、隔離等等,并且是選擇的宿主進(jìn)程(在可用的情況下)。而且,這種自宿主的進(jìn)程為進(jìn)程內(nèi)宿主提供獨(dú)特的優(yōu)點(diǎn):處理未知的客戶環(huán)境、依賴(lài)于TCP或IPC(當(dāng)只有IIS可用時(shí))、利用HTTP上的多個(gè)端口(當(dāng)只有IIS 6可用時(shí))以及通過(guò)編程方式存取一些高級(jí)宿主特征。 九. 綁定與任何給定的服務(wù)進(jìn)行通訊都存在多方面的問(wèn)題。首先,存在許多可能的通訊模式:消息可能是同步請(qǐng)求/響應(yīng)或異步式的'激活-忘記'模式(fire-and-forget);消息也可能是雙向的;消息能夠被立即傳輸或隊(duì)列化操作而該隊(duì)列可能是持久性的或易破壞性的。還存在許多可能的消息傳輸協(xié)議:例如HTTP(或HTTPS),TCP,P2P(端對(duì)端網(wǎng)絡(luò)),IPC(命名管道)或MSMQ。也存在一些可能的消息編碼選項(xiàng):你可以選擇普通文本以支持互操作性,二進(jìn)制編碼以便于優(yōu)化性能,或MTOM(消息傳輸優(yōu)化機(jī)制)以便處理巨大載荷。也存在一些消息保護(hù)選項(xiàng):你可以選擇不對(duì)之進(jìn)行保護(hù),你也可以使用它們來(lái)僅提供傳輸級(jí)安全或提供消息級(jí)隱私和安全,并且當(dāng)然,也存在很多種方式用于對(duì)客戶端實(shí)現(xiàn)認(rèn)證和授權(quán)。消息傳輸在跨越中間媒體和中斷連接時(shí)可能是不可靠的或可靠的端到端式,并且消息可能是以其發(fā)送的方式傳輸?shù)幕蚴且云浣邮辗绞絺鬏數(shù)摹?通訊服務(wù)可能需要與其它服務(wù)或僅能夠使用基本W(wǎng)eb服務(wù)協(xié)議的客戶端互操作,或者它們能夠使用WS-*現(xiàn)代協(xié)議的核心(例如WS-安全和WS-原子事務(wù))。通訊服務(wù)可能需要與舊式的客戶端通過(guò)原始的MSMQ消息進(jìn)行互操作,或你可能想限制通訊服務(wù)以便僅與另一個(gè)WCF服務(wù)或客戶端互操作。 簡(jiǎn)言之,通訊存在許多方面的內(nèi)容,包括大量的參數(shù)和決策點(diǎn)。其中,一些選擇可能是互斥的,而另一些選擇可能要求必須使用另外的相應(yīng)選擇。很明顯,客戶端和服務(wù)必須在所有這些選項(xiàng)上相吻合,以達(dá)到正確交流的目的。為了簡(jiǎn)化并使其更具可管理性,WCF小組共同在綁定中提供了一個(gè)這樣的通訊方面集合。個(gè)綁定僅僅是對(duì)于相協(xié)調(diào)的傳輸協(xié)議、消息編碼、通訊模式、可靠性、安全性、事務(wù)傳播和互操作性的預(yù)封裝。理想情況下,你能夠從通訊服務(wù)代碼中'提取'所有的這些繁重的任務(wù)方面并且允許它專(zhuān)注于實(shí)現(xiàn)業(yè)務(wù)邏輯。這樣做可以使你在相當(dāng)不同的繁重任務(wù)方面使用相同的服務(wù)邏輯,而綁定正好使你能夠?qū)崿F(xiàn)這一目的。你可以使用WCF提供的綁定,也就是說(shuō),你或者可以'濃縮'它們的屬性,或者是從頭編寫(xiě)通訊自己的定制綁定。一個(gè)服務(wù)在它的元數(shù)據(jù)中出版它的綁定選擇,這使得客戶端能夠查詢這種類(lèi)型和綁定的特定屬性,因?yàn)榭蛻舳吮仨毷褂门c服務(wù)完全一樣的綁定。單個(gè)服務(wù)能夠支持在獨(dú)立的地址上的多個(gè)綁定。通常,服務(wù)并不指定關(guān)于綁定本身。WCF定義了列舉于表格1中的共9種標(biāo)準(zhǔn)綁定。基于文本的編碼使一個(gè)WCF服務(wù)(或客戶端)能夠通過(guò)HTTP與任何其它服務(wù)(或客戶端)進(jìn)行交流而不考慮它的技術(shù);然而,通過(guò)TCP或IPC的二進(jìn)制編碼傳輸能夠產(chǎn)生最優(yōu)的性能,但是卻以失去極廣泛的互操作性為代價(jià)(因?yàn)樗仨毷褂肳CF到WCF的通訊)。表格1:WCF標(biāo)準(zhǔn)綁定名稱(chēng)傳輸編碼InteropBasicHttpBindingHTTP/HTTPSText+ NetTcpBindingTCPBinary-NetPeerTcpBindingP2PBinary-NetNamedPipeBindingIPCBinary-WSHttpBindingHTTP/HTTPSText,MTOM+WSFederationBindingHTTP/HTTPSText,MTOM+WSDualHttpBindingHTTPText,MTOM+NetMsmqBindingMSMQBinary-MsmqIntegrationBindingMSMQBinary+為一個(gè)傳輸協(xié)議選擇MSMQ能夠強(qiáng)制實(shí)現(xiàn)WCF到WCF或WCF到MSQM的通訊,但是,這僅是針對(duì)非連接的離線工作情況提供的。典型情況下,為通訊服務(wù)選擇一個(gè)綁定應(yīng)該遵循如圖4所示的策略活動(dòng)圖。圖4.策略活動(dòng)圖:該圖展示了選擇一個(gè)綁定的過(guò)程。你應(yīng)該問(wèn)自己的第一個(gè)問(wèn)題是,是否通訊服務(wù)需要與非WCF客戶進(jìn)行交互。如果回答'是',并且如果客戶端是一個(gè)舊的MSMQ客戶端,那么應(yīng)該選擇NetMsmqBinding-它可以使通訊服務(wù)與這樣的一個(gè)客戶端通過(guò)MSMQ進(jìn)行互操作。如果你需要與一非WCF客戶端進(jìn)行互操作并且該客戶端期望使用基本的Web服務(wù)協(xié)議(ASMX Web服務(wù)),那么,你可以選擇BasicHttpBinding-它能夠把通訊WCF服務(wù)暴露到外界,就好象它是一個(gè)ASMX Web服務(wù)一樣。缺點(diǎn)是你不能利用任何現(xiàn)代WS-*協(xié)議。然而,如果非WCF客戶端能理解這些標(biāo)準(zhǔn),那么,你可以選擇WS綁定之一,例如WSHttpBinding,WSFederationBinding或WSDualHttpBinding。如果你可以假定客戶端是一個(gè)WCF客戶端,但它要求離線或非連接性交互,那么你可以選擇使用MSMQ的NetMsmqBinding來(lái)傳輸消息。如果客戶端需要連接的通訊但能夠跨越計(jì)算機(jī)邊界被調(diào)用,那么你可以選擇通過(guò)TCP進(jìn)行通訊的NetTcpBinding。如果客戶端位于與服務(wù)同一臺(tái)計(jì)算機(jī)上,那么你可以選擇使用命名管道的NetNamedPipeBinding來(lái)(IPC)最優(yōu)化性能。注意,一個(gè)使用NetNamedPipeBinding的服務(wù)不能接受除它自己以外的來(lái)自任何其它計(jì)算機(jī)的調(diào)用,并且這樣也會(huì)更為安全。你可以基于其它標(biāo)準(zhǔn)(例如,回調(diào)需要(WSDualHttpBinding),端對(duì)端網(wǎng)絡(luò)(NetPeerTcpBinding)或聯(lián)盟安全(WSFederationBinding))來(lái)詳細(xì)地調(diào)整綁定選擇。十. 端點(diǎn)每一個(gè)服務(wù)都關(guān)聯(lián)于一個(gè)定義了該服務(wù)所在位置的地址,一個(gè)定義了如何與服務(wù)進(jìn)行通訊的綁定和一個(gè)定義了該服務(wù)所實(shí)現(xiàn)功能的合同。事實(shí)上,WCF用端點(diǎn)的形式來(lái)形式化描述這種關(guān)系。該端點(diǎn)是地址、合同和綁定的一個(gè)結(jié)合(見(jiàn)圖5)。每一個(gè)服務(wù)必須具有三個(gè)端點(diǎn),而且由服務(wù)暴露該端點(diǎn)。從邏輯上講,端點(diǎn)是服務(wù)的接口,并且類(lèi)似于一個(gè)CLR或COM接口。圖5.該端點(diǎn)是地址、合同和綁定的結(jié)合每一個(gè)服務(wù)必須暴露至少一個(gè)業(yè)務(wù)端點(diǎn),并且每一個(gè)端點(diǎn)都具有一個(gè)相同的合同。在一個(gè)服務(wù)上的所有的端點(diǎn)都具有唯一的地址,而單個(gè)服務(wù)可以暴露多個(gè)端點(diǎn)。這些端點(diǎn)能夠使用相同的或不同的綁定并能暴露相同的或不同的合同。你可以使用一個(gè)配置文件來(lái)以管理方式配置端點(diǎn)或以編程方式來(lái)實(shí)現(xiàn)端點(diǎn)配置。

十一. 管理端點(diǎn)配置請(qǐng)考慮下列服務(wù)定義:namespace MyNamespace{[ServiceContract]interface IMyContract{...}Class MyService : IMyContract{...}} 列表2(見(jiàn)本文相應(yīng)下載源碼)展示了在宿主進(jìn)程配置文件中要求的入口。管理配置是在大多數(shù)情況下的配置,因?yàn)樗峁╈`活性來(lái)實(shí)現(xiàn)改變服務(wù)地址、綁定甚至暴露合同而不必重新構(gòu)建和重新發(fā)布服務(wù)。源碼中的列表3展示了一個(gè)配置文件-它定義暴露多個(gè)端點(diǎn)的單個(gè)服務(wù)。注意,這些端點(diǎn)必須提供一個(gè)與綁定相一致的基地址(例如,對(duì)于HTTP使用WSHttpBinding綁定)。每一個(gè)不匹配都會(huì)導(dǎo)致在服務(wù)加載時(shí)刻拋出一個(gè)異常。只要URI是不同的,那么你可以使用相同的基地址來(lái)配置多個(gè)端點(diǎn):<service name='MyNamespace.MyService'><endpoint Address ='net.tcp://localhost:8001/Service1/' .../><endpointaddress='net.tcp://localhost:8001/Service2/' .../></service>還可以省略地址-在這種情況下,該服務(wù)使用與宿主一起注冊(cè)的基地址(宿主必須提供一個(gè)匹配的基地址):<endpointbinding='wsHttpBinding'contract='MyNamespace.IMyContract' /> 可以僅提供一個(gè)URI-在這種情況下,地址是在基地址下的相對(duì)地址(并且宿主必須提供一個(gè)匹配的基地址):<endpointaddress='SubAddress' .../>當(dāng)提供一個(gè)基地址時(shí),該端點(diǎn)覆蓋宿主所提供的任何基地址:<endpointaddress='http://localhost:8000/MyService/' .../>注意,當(dāng)使用IIS進(jìn)行宿主時(shí),服務(wù)必須使用IIS基地址(在HTTP中使用計(jì)算機(jī)名+虛擬目錄)。十二. 端點(diǎn)配置編程以編程方式實(shí)現(xiàn)端點(diǎn)配置完全等價(jià)于管理配置;然而,它不必依賴(lài)于一個(gè)配置文件而是可以通過(guò)編程調(diào)用來(lái)把端點(diǎn)添加到ServiceHost實(shí)例。再次強(qiáng)調(diào)的是,這些調(diào)用總是位于服務(wù)代碼的范圍之外。ServiceHost提供AddServiceEndpoint()方法的重載版本:public class ServiceHost : ServiceHostBase { public ServiceEndpoint AddServiceEndpoint(Type implementedContract, Binding binding,String address); //另外的成員}列表4展示了與在列表3中的端點(diǎn)一樣的可編程的配置。為了依賴(lài)宿主基地址,只需要提供如地址一樣的URI即可:Uri tcpBaseAddress = new Uri('http://localhost:8000/');ServiceHost serviceHost = new ServiceHost(typeof(MyService),tcpBaseAddress);Binding tcpBinding = new NetTcpBinding();//使用基地址作為地址serviceHost.AddServiceEndpoint(typeof(IMyContract) ,tcpBinding,'');//添加相對(duì)地址serviceHost.AddServiceEndpoint(typeof(IMyContract), tcpBinding,'MyService');//忽略基地址serviceHost.AddServiceEndpoint(typeof(IMyContract), tcpBinding,'net.tcp://localhost:8001/MyService');serviceHost.Open();十三. 小結(jié)在本篇中,我們?nèi)娼榻B了構(gòu)建一個(gè)WCF服務(wù)所需要的基本概念,有關(guān)完整的WCF服務(wù)的例子請(qǐng)參考本文相應(yīng)源碼。在下篇中,我們將給出一個(gè)使用WCF進(jìn)行Windows開(kāi)發(fā)的客戶端案例分析。

標(biāo)簽: Windows系統(tǒng) WinVista
主站蜘蛛池模板: 清丰县| 磴口县| 盖州市| 白玉县| 林甸县| 沁阳市| 股票| 陆河县| 西藏| 当阳市| 临猗县| 陇西县| 体育| 姜堰市| 宁都县| 永泰县| 永安市| 綦江县| 徐汇区| 石家庄市| 福清市| 仙居县| 府谷县| 白朗县| 铜鼓县| 湛江市| 汕头市| 西畴县| 天气| 邵阳县| 堆龙德庆县| 施秉县| 龙川县| 千阳县| 潍坊市| 石台县| 榆中县| 曲周县| 望城县| 萨嘎县| 金阳县|