asp.net 分布式应用开发
生活随笔
收集整理的這篇文章主要介紹了
asp.net 分布式应用开发
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Net Framework推出的許多新技術(shù)為上述任務(wù)的實(shí)現(xiàn)提供了相對(duì)簡(jiǎn)單的解決方案。其中,基于SOAP的Web Service在處理分布式應(yīng)用時(shí)具有比傳統(tǒng)的DCOM/CORBA明顯的優(yōu)點(diǎn),結(jié)合基于Web的ASP.NET頁(yè)面開(kāi)發(fā)技術(shù)和SQL Server數(shù)據(jù)存儲(chǔ)技術(shù)(或Xml文檔),在.Net下開(kāi)發(fā)N層應(yīng)用程序也不再困難。?
一、分布式處理概述?
分布式處理是將應(yīng)用程序邏輯分布到2臺(tái)或者更多臺(tái)計(jì)算機(jī)上,在物理上或邏輯上分離的單元中。這一概念并不是新生事物,在大型工程已經(jīng)得到廣泛使用。只不過(guò),Internet的出現(xiàn)為分布式處理賦予了新的特征,Internet內(nèi)部連接的特性可以讓成百上千的計(jì)算機(jī)為一個(gè)任務(wù)工作,使得在更大規(guī)模上實(shí)施分布式處理成為可能,并跨越了傳統(tǒng)的B/S(客戶機(jī)/服務(wù)器)模型。?
分布式處理思想經(jīng)歷了很長(zhǎng)的過(guò)程,不同IT時(shí)代的開(kāi)發(fā)人員、各級(jí)供應(yīng)商做了大量的工作,使得支持分布式處理的協(xié)議極為豐富。?
1、 DCOM/CORBA?
在.Net Framework之前,基于組件的分布式計(jì)算的主要協(xié)議是CORBA(Common Object Request Broker Architecture,通用對(duì)象請(qǐng)求代理結(jié)構(gòu)),它來(lái)自O(shè)bject Management Group(對(duì)象管理組),還有Microsoft的DCOM(Distributed Component Object Model,分布式組件對(duì)象模型)。?
DCOM是面向連接的。DCOM客戶機(jī)持有對(duì)DCOM服務(wù)器的連接。這種連接方式導(dǎo)致了技術(shù)問(wèn)題存在。例如,客戶機(jī)可能持有引用信息,只有在用戶單擊按鈕時(shí)生成調(diào)用。時(shí)間一長(zhǎng),服務(wù)器就會(huì)因等待客戶機(jī)的請(qǐng)求而空閑。當(dāng)客戶機(jī)崩潰而無(wú)法請(qǐng)求服務(wù)器時(shí),就會(huì)產(chǎn)生嚴(yán)重的后果。另外,在Internet上,DCOM或者CORBA服務(wù)器由數(shù)千臺(tái)客戶機(jī)使用,由于每一臺(tái)客戶機(jī)都有一個(gè)與服務(wù)器的連接,對(duì)于很少使用服務(wù)器或者根本不再使用服務(wù)器的客戶機(jī),應(yīng)該保護(hù)寶貴的服務(wù)器資源。?
盡管DCOM有辦法處理這些問(wèn)題,但是增加了許多復(fù)雜性,這也是Web服務(wù)試圖解決的問(wèn)題之一。?
2、Web 服務(wù)?
隨著Microsoft .Net Framewwork的推出,實(shí)現(xiàn)分布式處理有了新的技術(shù),即Web Service(Web服務(wù))。Web服務(wù)能夠?yàn)榱硪粋€(gè)應(yīng)用程序而不僅僅是瀏覽器提供數(shù)據(jù),并通過(guò)外置數(shù)據(jù)以允許其他的客戶機(jī)使用在同樣的端口和傳輸層都起作用的標(biāo)準(zhǔn)協(xié)議(如HTTP)來(lái)執(zhí)行操作。?
二、Web Service-.Net Framework下的分布式處理技術(shù)?
在.Net Framework中,Web服務(wù)指是以獨(dú)立于平臺(tái)的方式,通過(guò)標(biāo)準(zhǔn)的Web協(xié)議,可以由程序訪問(wèn)的應(yīng)用程序邏輯單元。?
.Net Framework的開(kāi)發(fā)者們將Web服務(wù)定位于基于開(kāi)放的標(biāo)準(zhǔn),能夠用于任何平臺(tái)。使它擁有作為跨平臺(tái)和跨供應(yīng)商的集成技術(shù)的潛力。實(shí)現(xiàn)了Web服務(wù)和Web服務(wù)構(gòu)架后,用戶就可以利用Internet上許多現(xiàn)有技術(shù)。Web服務(wù)成功的關(guān)鍵在于它基于開(kāi)放的標(biāo)準(zhǔn),諸如Microsoft、IBM和Sun等主要供應(yīng)商都支持這些標(biāo)準(zhǔn)。?
1、DCOM/CORBA面臨困難之解決方案--Web服務(wù)?
DCOM和CORBA在使用運(yùn)行于相同平臺(tái)的軟件和緊密管理的局域網(wǎng)創(chuàng)建企業(yè)應(yīng)用程序時(shí)非常優(yōu)秀。但是,他們?cè)趧?chuàng)建跨平臺(tái) 、跨Internet、適應(yīng)Internet的可伸縮性的應(yīng)用程序時(shí)力不從心。他們不是為完成這些目標(biāo)而設(shè)計(jì)的。?
大多數(shù)公司面臨的現(xiàn)實(shí)情況是他們擁有來(lái)自多個(gè)供應(yīng)商的多種平臺(tái)。運(yùn)行于不同平臺(tái)上的應(yīng)用程序系統(tǒng)間通信困難。在與商務(wù)伙伴合作時(shí),基于傳統(tǒng)分布式的架構(gòu)合作困難。?
DCOM和CORBA的問(wèn)題是用戶基本上要依賴一個(gè)供應(yīng)商。如果要使用DCOM,就必須使用Microsoft Windows來(lái)運(yùn)行服務(wù)器和客戶機(jī)。盡管有其他平臺(tái)上的DCOM實(shí)現(xiàn)方式,但是他們未被廣泛采納。雖然CORBA是由多個(gè)供應(yīng)商實(shí)現(xiàn)的規(guī)范,互操作性仍只能以簡(jiǎn)單的方式完成,至于DCOM和CORBA間的集成就不必說(shuō)了。?
從技術(shù)方面看,Web服務(wù)試圖解決使用諸如CORBA和DCOM這樣緊密捆綁的技術(shù)時(shí)遇到的問(wèn)題。這些問(wèn)題包括如何通過(guò)防火墻,協(xié)議的復(fù)雜性,異類平臺(tái)的集成等。?
2、Web服務(wù)在分布式處理中的應(yīng)用?
Web服務(wù)是一種優(yōu)秀的分布式處理技術(shù)。?
下圖演示了在.Net Framework下進(jìn)行分布式處理的一般情形。作為客戶端應(yīng)用程序可以是傳統(tǒng)的Windows Form應(yīng)用程序、基于Web的Asp.net應(yīng)用程序、蜂窩式移動(dòng)應(yīng)用程序等,還可以是另外的Web服務(wù)程序。這些客戶端應(yīng)用程序構(gòu)成N層模型中的表示層(圖中左列)用于數(shù)據(jù)顯示。中間列是中間層,處理商務(wù)邏輯;右列是數(shù)據(jù)層,處理數(shù)據(jù)存儲(chǔ)。?
隨著一個(gè)基于xml的名為簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議SOAP(Simple Object Access Protocol)的不斷標(biāo)準(zhǔn)化,web服務(wù)正成為一個(gè)可以和其他服務(wù)器和應(yīng)用程序交互、可行的方法。?
3、N層模型下客戶機(jī)消費(fèi)Web服務(wù)?
下圖演示了客戶機(jī)消費(fèi)Web服務(wù)的情形。客戶機(jī)可以是一個(gè)Web應(yīng)用程序、另一個(gè)Web服務(wù)、諸如Microsoft Word的字處理程序等。?
Web服務(wù)的消費(fèi)者調(diào)用名為Method()的Web服務(wù)上的方法。實(shí)際調(diào)用向下層傳播,作為Soap消息通過(guò)網(wǎng)絡(luò),并向上層傳播到Web服務(wù)。Web服務(wù)執(zhí)行并響應(yīng)(如果有的話)。?
實(shí)現(xiàn)Web服務(wù)與客戶機(jī)之間的雙向通知或者發(fā)布/訂閱功能是可能的,但是必須手工完成。客戶機(jī)可以實(shí)現(xiàn)自己的Web服務(wù)并在對(duì)服務(wù)器的調(diào)用中傳遞該Web服務(wù)的
三、基于.Net Framework的N層構(gòu)架設(shè)計(jì)?
面向?qū)ο蟮摹⒒谀K化的組件設(shè)計(jì)需要能夠方便地修改應(yīng)用程序的各個(gè)部分。完成這一目標(biāo)的一種好方法就是在層上工作,將一個(gè)應(yīng)用程序的主要功能分離到不同的層或者級(jí)中。.Net Framework為創(chuàng)建可維護(hù)、可擴(kuò)展的層模式提供了豐富的支持,使得N層夠架取代傳統(tǒng)的客戶機(jī)/服務(wù)器模式而與Internet緊密結(jié)合。?
1、分層模型?
從本質(zhì)上講,層代表了一個(gè)應(yīng)用程序主要的功能。一般地,我們將應(yīng)用程序功能分為三個(gè)方面,對(duì)應(yīng)3層架構(gòu)模式。它們是數(shù)據(jù)層(data layer)、商務(wù)層(business layer)和表示層(presentation layer)。?
數(shù)據(jù)層:包含數(shù)據(jù)存儲(chǔ)和與它交互的組件或服務(wù)。這些組件和服務(wù)在功能上和中間層相互獨(dú)立(盡管在物理上不必一定相互獨(dú)立--它們可以在同一臺(tái)服務(wù)器上)。?
中間層:包括一個(gè)或者多個(gè)組件服務(wù),它們應(yīng)用商務(wù)規(guī)則、實(shí)現(xiàn)應(yīng)用程序邏輯并完成應(yīng)用程序運(yùn)行所需要的數(shù)據(jù)處理。作為這個(gè)過(guò)程的一部分,中間層負(fù)責(zé)處理來(lái)自數(shù)據(jù)存儲(chǔ)或者發(fā)送給數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)。?
表示層:從中間層獲得信息并顯示給用戶。該層同時(shí)也負(fù)責(zé)和用戶進(jìn)行交互,比較返回的信息并將信息回送給中間層進(jìn)行處理。?
可見(jiàn),數(shù)據(jù)層從數(shù)據(jù)庫(kù)中獲得較為原始的數(shù)據(jù),商務(wù)層把數(shù)據(jù)轉(zhuǎn)換成符合商務(wù)規(guī)則的有意義的信息,表示層把信息轉(zhuǎn)換成對(duì)于用戶有意義的內(nèi)容。?
這種分層設(shè)計(jì)方式很有用,因?yàn)槊恳粚佣伎梢元?dú)立地修改。我們可以修改商務(wù)層,不斷地從數(shù)據(jù)層接受相同的數(shù)據(jù),并把這些數(shù)據(jù)傳遞到表示層,而不用擔(dān)心出現(xiàn)歧義。我們也可以修改表示層,使得對(duì)于站點(diǎn)外觀的修改不必改動(dòng)下面的商務(wù)層邏輯。?
2、常用的N層模型設(shè)計(jì)?
已經(jīng)知道,一個(gè)N層應(yīng)用程序中的層不是由運(yùn)行應(yīng)用程序的物理結(jié)構(gòu)(硬件)定義的。層是應(yīng)用程序運(yùn)行的一個(gè)邏輯方面的功能,并定義應(yīng)用程序?qū)?zhí)行的不同的任務(wù)階段。這里的N層設(shè)計(jì)與經(jīng)典的客戶機(jī)/服務(wù)器架構(gòu)截然不同。?
1)、設(shè)計(jì)一個(gè)簡(jiǎn)單的3層?
最簡(jiǎn)單的N層模型就是3層。這里,我們已經(jīng)有一個(gè)被網(wǎng)絡(luò)分隔開(kāi)的服務(wù)器和客戶機(jī)。服務(wù)器中含有數(shù)據(jù)存儲(chǔ)和組成數(shù)據(jù)層的數(shù)據(jù)訪問(wèn)組件,已經(jīng)組成中間層的商務(wù)邏輯。客戶機(jī)作為表示層只需要給應(yīng)用程序提供界面即可。?
在這個(gè)最簡(jiǎn)單的情況中我們或許有一個(gè)關(guān)系數(shù)據(jù)庫(kù)或者一組訪問(wèn)數(shù)據(jù)的組件或者存儲(chǔ)過(guò)程。然后我們應(yīng)當(dāng)有一個(gè)訪問(wèn)組件或者存儲(chǔ)過(guò)程的asp.net頁(yè)面來(lái)提取信息,處理和格式化信息使之適合于特定的客戶機(jī),然后通過(guò)網(wǎng)絡(luò)將信息傳送給客戶機(jī)。客戶機(jī)所要做的事情就是顯示信息、收集用戶的輸入和將信息回送給中間層。?
2)、設(shè)計(jì)一個(gè)更接近現(xiàn)實(shí)的3層?
然而前面的示例只是非常小的應(yīng)用程序的一般情況,現(xiàn)實(shí)世界中很難碰到。數(shù)據(jù)存儲(chǔ)通常位于專門選擇和經(jīng)過(guò)專門設(shè)置的硬件上。它也許是在運(yùn)行SQL Server的基于Windows的一組服務(wù)器上,但是也可能是運(yùn)行非Windows平臺(tái)或Oracle或者其他的數(shù)據(jù)庫(kù)服務(wù)器上。?
在這種情況下,數(shù)據(jù)層和中間層之間的分離就更加顯而易見(jiàn)--它們之間通過(guò)網(wǎng)絡(luò)連接。并且,商務(wù)邏輯被限制在執(zhí)行所有中間層數(shù)據(jù)處理的服務(wù)器上。?
3)、設(shè)計(jì)N層?
很明顯,上面的情況都假定了兩件事:一是客戶機(jī)為一個(gè)低端設(shè)備(因此不參與應(yīng)用程序中所需的實(shí)際數(shù)據(jù)處理);另外就是只有一組商務(wù)規(guī)則。?
然而,這些假設(shè)并不符合實(shí)際的應(yīng)用程序。例如,我們通常期望商務(wù)規(guī)則在其他某個(gè)地方而非在中間層中。在提取數(shù)據(jù)過(guò)程的前期實(shí)現(xiàn)某個(gè)商務(wù)邏輯比較恰當(dāng),當(dāng)然我們也可以在訪問(wèn)數(shù)據(jù)存儲(chǔ)的組件中實(shí)現(xiàn)商務(wù)邏輯。這個(gè)商務(wù)邏輯"包"因此能和數(shù)據(jù)存儲(chǔ)在同一個(gè)服務(wù)器上,或者甚至(在一個(gè)分組的環(huán)境中)在另外一個(gè)中間路由服務(wù)器上。?
另外,為了充分利用"胖客戶機(jī)"的一些性能,以便減少網(wǎng)絡(luò)負(fù)載和因訪問(wèn)路徑循環(huán)而導(dǎo)致的遲滯,我們可以將一些商務(wù)邏輯放在客戶機(jī)上。?
下圖就顯示了這種變化,其中商務(wù)邏輯已經(jīng)從中間層剝離并位于數(shù)據(jù)服務(wù)器或者客戶機(jī)上。?
可見(jiàn),這種模式?jīng)]有中間存儲(chǔ)并且?guī)缀醪恍枰虚g數(shù)據(jù)處理,所以效率更高。?
4)、設(shè)計(jì)一個(gè)更加現(xiàn)實(shí)的N層?
一般地,我們使用一個(gè)或者多個(gè)分離的服務(wù)器來(lái)維持我們正在使用的數(shù)據(jù)存儲(chǔ),這時(shí),商務(wù)邏輯的分布更為分散。下圖顯示了由兩個(gè)網(wǎng)絡(luò)分離的三個(gè)機(jī)器。可以看出,現(xiàn)在的商務(wù)邏輯被分為三個(gè)區(qū):一些將和數(shù)據(jù)存儲(chǔ)運(yùn)行在同一臺(tái)服務(wù)器上,另一些將在中間層服務(wù)器上運(yùn)行,還有一些將在客戶機(jī)上運(yùn)行。?
由此可以看到,準(zhǔn)確定義各個(gè)層并不容易。"中間層"的真正意思是商務(wù)邏輯本身,并且,商務(wù)邏輯的不同元素可以無(wú)可非議地存在于不同的服務(wù)器中。?
3、.Net Framework下的層間(遠(yuǎn)程)傳輸對(duì)象及技術(shù)?
.Net Framework實(shí)現(xiàn)了許多新的技術(shù)以支持多層分布式處理,它提供了豐富的類庫(kù)、對(duì)象及方法使得在不同層(物理上分離或僅僅是邏輯上分離)間的數(shù)據(jù)傳輸更為簡(jiǎn)單。?
1)、支持遠(yuǎn)程數(shù)據(jù)傳送的對(duì)象:?
l ADO.NET DataSet對(duì)象?
l ADO.NET DataTable對(duì)象?
l XmlDocument對(duì)象?
l XmlDataDocument對(duì)象?
2)、支持遠(yuǎn)程數(shù)據(jù)傳送的類/方法:?
l Serialization類?
Serialization類描述了一個(gè)將數(shù)據(jù)轉(zhuǎn)換為一種能復(fù)制到另一個(gè)過(guò)程的格式的對(duì)象的過(guò)程。前面提及的可遠(yuǎn)程傳輸?shù)膶?duì)象具有串行化整個(gè)內(nèi)容的能力,以便它可以通過(guò)一個(gè)通道來(lái)傳送。這個(gè)通道可以直接通過(guò)TCP/IP,或者通過(guò)HTTP。當(dāng)然,它們也可以在另一端解除串行化,因此客戶機(jī)就得到一個(gè)原對(duì)象的完整副本。
System.Runtime.Remoting命名空間提供的對(duì)象可用來(lái)為對(duì)象創(chuàng)建代理以實(shí)現(xiàn)遠(yuǎn)程數(shù)據(jù)傳送。在這種情形下,對(duì)象保留在服務(wù)器上,并且客戶機(jī)只收到一個(gè)代理對(duì)象的引用。這個(gè)代理對(duì)象表示原來(lái)的基于服務(wù)器的對(duì)象(這就是我們?cè)鯓舆h(yuǎn)程使用一個(gè)DataReader的方法),示意如下圖:?
對(duì)于客戶機(jī),這個(gè)代理提供了與原始對(duì)象相同的方法和屬性。然而,當(dāng)客戶機(jī)與代理對(duì)象相互作用時(shí),調(diào)用被自動(dòng)串行化,并通過(guò)通道(網(wǎng)絡(luò))傳送給服務(wù)器上的對(duì)象。然后,任何響應(yīng)和結(jié)果通過(guò)通道被傳送回客戶機(jī)。?
這兩個(gè)遠(yuǎn)程技術(shù)都允許客戶機(jī)使用原來(lái)在服務(wù)器上創(chuàng)建的對(duì)象。我們能夠串行化一個(gè)DataSet對(duì)象或者Xml文檔,同時(shí)我們也能串行化其它的如集合這樣的對(duì)象--比如一個(gè)哈希表(Hashtable)或數(shù)組(Array)。?
4、N層模型中的數(shù)據(jù)處理及對(duì)象選擇?
首先需要考慮的是希望從數(shù)據(jù)存儲(chǔ)中提取出來(lái)的數(shù)據(jù)做些什么?這個(gè)問(wèn)題的答案對(duì)我們所使用對(duì)象的基本選擇的影響將比其他任何事情都要大,甚至在某種程度上定義了我們希望完成任務(wù)的性能的種類。?
1)、只用于顯示的數(shù)據(jù)?
如果只是想以一種固定格式為終端用戶顯示數(shù)據(jù)的話,一般來(lái)說(shuō)根本就沒(méi)有必要遠(yuǎn)程傳輸數(shù)據(jù)。我們沒(méi)有必要在線上將所有的數(shù)據(jù)傳送給客戶機(jī)--我們只能傳給它們客戶設(shè)備能接受的任何格式的最終顯示信息。?
在這種情形中,"Reader"對(duì)象提供了一種只讀的、僅向前的理想且性能最優(yōu)的技術(shù)。當(dāng)與能實(shí)現(xiàn)服務(wù)器端數(shù)據(jù)綁定的服務(wù)器控件一起使用時(shí),我們可以獲得一個(gè)顯示數(shù)據(jù)的高效方法。?
2)、需要遠(yuǎn)程傳輸?shù)臄?shù)據(jù)?
然而,如果我們需要遠(yuǎn)程傳輸數(shù)據(jù)的話則存在一個(gè)問(wèn)題。這些快速而高效的"Reader"對(duì)象只在作為一個(gè)引用時(shí)才能被遠(yuǎn)程傳輸。將一個(gè)DataReader作為引用傳送給一個(gè)客戶機(jī)時(shí),DataReader仍還在服務(wù)器上,不過(guò)客戶機(jī)的應(yīng)用程序也可以使用它。在這種情況下,我們實(shí)際上并沒(méi)有遠(yuǎn)程傳輸數(shù)據(jù),而是使用了一個(gè)遠(yuǎn)程傳輸對(duì)象。在很多情況下都存在這種情況。?
要實(shí)現(xiàn)數(shù)據(jù)的遠(yuǎn)程傳送,應(yīng)該將數(shù)據(jù)寄存到一個(gè)能夠存儲(chǔ)(或保持)數(shù)據(jù)的對(duì)象中。并允許代碼不需進(jìn)入數(shù)據(jù)存儲(chǔ)的額外行程就可以根據(jù)需要提取數(shù)據(jù),并且多次讀取。在ADO.NET中,這個(gè)對(duì)象就是DataSet對(duì)象(或者DataTable對(duì)象)。當(dāng)使用xml時(shí),也有幾個(gè)對(duì)象供選擇。我們能夠遠(yuǎn)程傳輸XmlDocument和XmlDataDocument對(duì)象。這兩個(gè)對(duì)象都有保持內(nèi)容的能力,并且可以在一個(gè)應(yīng)用程序的層之間進(jìn)行傳送。?
四、N層分布式數(shù)據(jù)處理架構(gòu)模型?
要進(jìn)一步理解怎樣在應(yīng)用程序中劃分不同的層,需要確定數(shù)據(jù)如何顯示以及是否需要更新數(shù)據(jù)和向服務(wù)器及時(shí)返回更新。?
1、全部在服務(wù)器上完成顯示?
在客戶機(jī)上顯示數(shù)據(jù),最常見(jiàn)的情形是在一組或者多組服務(wù)器上執(zhí)行所有的數(shù)據(jù)處理。數(shù)據(jù)層和中間層限于服務(wù)器,客戶機(jī)只提供顯示接口。對(duì)于一個(gè)web瀏覽器來(lái)說(shuō),通常的格式為html,對(duì)于一個(gè)蜂窩式電話或類似設(shè)備來(lái)說(shuō),可能是以wml格式表示,等等。?
下圖使用一個(gè)存儲(chǔ)過(guò)程或SQL語(yǔ)句來(lái)提取所需要的數(shù)據(jù),然后用asp.net進(jìn)行處理,或者執(zhí)行一個(gè)web服務(wù)。另外,這里也用xml片段的形式從數(shù)據(jù)存儲(chǔ)中提取數(shù)據(jù),然后對(duì)數(shù)據(jù)進(jìn)行處理并提供給客戶機(jī)。?
如果以xml文檔形式存儲(chǔ)數(shù)據(jù),或者以這樣一種格式存儲(chǔ)數(shù)據(jù):數(shù)據(jù)作為xml外置數(shù)據(jù)層,那么我們就有一些其他的選擇。?
下圖顯示了怎樣提取和處理xml數(shù)據(jù)以便傳送給客戶機(jī)使用。此外,數(shù)據(jù)的提取其實(shí)就是借助一個(gè)"Reader"對(duì)象,并且可以使用不同的技術(shù)來(lái)處理數(shù)據(jù)并將數(shù)據(jù)提供給客戶機(jī)。
2、擴(kuò)展中間層?
雖然數(shù)據(jù)的提取和處理經(jīng)常在一個(gè)對(duì)象里發(fā)生,比如一個(gè)Asp.Net頁(yè)面,但是為了有效利用由于使用基于組件的設(shè)計(jì)而提供的好處,通常需要提供更為精細(xì)的架構(gòu)。我們應(yīng)該有在顯示數(shù)據(jù)或者將其傳送給客戶機(jī)之前應(yīng)用于數(shù)據(jù)的商務(wù)規(guī)則。換句話說(shuō),它可能是因?yàn)榘踩脑?#xff0c;也可能是為了實(shí)現(xiàn)分布式處理,或者只是提供可重用性和使應(yīng)用程序的維護(hù)更加容易。?
例如,應(yīng)該有訪問(wèn)一個(gè)數(shù)據(jù)存儲(chǔ)并提取一系列消費(fèi)者的多個(gè)頁(yè)面。通過(guò)在一個(gè)獨(dú)立于asp.net頁(yè)面或其他提供數(shù)據(jù)給客戶機(jī)的對(duì)象的組件中建立這個(gè)過(guò)程,我們能夠提供一個(gè)提取數(shù)據(jù)的層。然后,我們?cè)趯?lái)需要在某些方面改變數(shù)據(jù)存儲(chǔ)或者數(shù)據(jù)結(jié)構(gòu),或者改變?cè)L問(wèn)它的規(guī)則,我們只要用一個(gè)新的版本替換組件即可。?
只要組件的接口仍然未變,所有使用這個(gè)接口的應(yīng)用程序?qū)⒖吹絹?lái)自組件的相同輸出并和以前一樣繼續(xù)運(yùn)行。然而,組件在內(nèi)部用來(lái)提取和處理來(lái)自數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)的方法可以根據(jù)需要進(jìn)行相應(yīng)修改。下圖示意了這種架構(gòu)。?
顯然,該過(guò)程可以使用多個(gè)組件。如果數(shù)據(jù)的提取相當(dāng)復(fù)雜,或者同一數(shù)據(jù)運(yùn)用在多個(gè)地方的話,進(jìn)一步分解數(shù)據(jù)處理(分解為更多組件層)就很有意義。例如,可用一個(gè)組件將數(shù)據(jù)當(dāng)作一系列包含所有必須列的行(以關(guān)鍵字順序排列),這個(gè)組件就可以成為其他以不同順序存儲(chǔ)數(shù)據(jù)的組件,或者僅外置數(shù)據(jù)的某些列的組件的數(shù)據(jù)源。?
3、移動(dòng)數(shù)據(jù)處理到客戶機(jī)?
一般地,要獲得發(fā)送給客戶機(jī)的數(shù)據(jù),我們將利用客戶端腳本(JavaScript或 VBScript以及 WMLScript)、用Java或者一個(gè)特定平臺(tái)的語(yǔ)言書(shū)寫(xiě)的客戶端組件,或者用諸如Visual Basic 6.0、C++、Delphi等語(yǔ)言書(shū)寫(xiě)的客戶端可執(zhí)行程序等等。當(dāng)然,所有我們需要的功能都是.Net Framework的一部分。(用戶可通過(guò)下載和安裝可重新分配的Framework(大約5MB)在客戶機(jī)上使用Framework)。?
因此,下面的示意圖顯示了一些用于實(shí)現(xiàn)獲得發(fā)送給客戶機(jī)的數(shù)據(jù)并在客戶機(jī)上進(jìn)行處理的方法。?
4、將更新回送給服務(wù)器?
在許多情況下,如果我們的要求就是以一種盡可能快速和高效的方式獲得發(fā)送給客戶機(jī)的依據(jù),那么,上面的示例能很好地完成任務(wù)。然而,許多應(yīng)用程序要求客戶機(jī)將數(shù)據(jù)回送以更新數(shù)據(jù)存儲(chǔ)等操作時(shí),就需要尋找更合理的模式。?
至少有三種方法用于向服務(wù)器端回送數(shù)據(jù)。一是回送Html表單和查詢字符串(實(shí)現(xiàn)方式與以前的ASP類似);另一是客戶端組件(例如IE5及以上版本的XMLHTTP組件);還有就是客戶端可執(zhí)行的Windows表單應(yīng)用程序和服務(wù)等。?
因此,應(yīng)該有這樣一種情況:客戶機(jī)僅僅要求我們發(fā)送一些數(shù)據(jù),并且我們讓客戶機(jī)完成所有的數(shù)據(jù)處理。也就是說(shuō),客戶機(jī)充當(dāng)某種類型的服務(wù),它將應(yīng)用程序的數(shù)據(jù)作為自己的源數(shù)據(jù)來(lái)使用,然后在它的客戶機(jī)已經(jīng)處理數(shù)據(jù)后將更改提交回來(lái)。?
一旦客戶端完成了數(shù)據(jù)更新,或者已經(jīng)收集了用戶輸入的新數(shù)據(jù),客戶機(jī)應(yīng)用程序就以一種合適的格式打包數(shù)據(jù)(或者用正確的技術(shù)整理數(shù)據(jù)),并將它提交給服務(wù)器進(jìn)行處理和存儲(chǔ)。?
下圖顯示了利用"胖客戶機(jī)"來(lái)實(shí)現(xiàn)這種架構(gòu)的方法,其中數(shù)據(jù)在客戶機(jī)上進(jìn)行處理,然后經(jīng)整理后返回給服務(wù)器來(lái)更新原始的數(shù)據(jù)存儲(chǔ)。?
仍然地,這不是一個(gè)包含所有可能性的圖表。回送數(shù)據(jù)的方法或許和發(fā)送數(shù)據(jù)的方法沒(méi)有什么聯(lián)系。你應(yīng)該根據(jù)應(yīng)用程序的實(shí)際需求設(shè)計(jì)合適的模型。?
五、結(jié)束語(yǔ)?
建立可維護(hù)、可擴(kuò)展的站點(diǎn),開(kāi)發(fā)高效率、高伸縮性的應(yīng)用程序、實(shí)現(xiàn)跨平臺(tái)、跨Internet的應(yīng)用集成、創(chuàng)建N層分布式應(yīng)用程序是擺在無(wú)數(shù)開(kāi)發(fā)者面前的任務(wù)。傳統(tǒng)開(kāi)發(fā)方式及技術(shù)面臨了困難。?
.Net Framework推出的許多新技術(shù)為這些任務(wù)的實(shí)現(xiàn)提供了相對(duì)簡(jiǎn)單的解決方案。其中,基于SOAP的Web Service在處理分布式應(yīng)用時(shí)具有比傳統(tǒng)的DCOM/CORBA明顯的優(yōu)點(diǎn),結(jié)合基于Web的ASP.NET頁(yè)面開(kāi)發(fā)技術(shù)和SQLServer數(shù)據(jù)存儲(chǔ)技術(shù)(或Xml文檔),在.Net下開(kāi)發(fā)N層應(yīng)用程序也不再困難。?
要很好地完成以上任務(wù),你需要根據(jù)實(shí)際情況設(shè)計(jì)合理的應(yīng)用程序架構(gòu)模型。本文正是為了在這方面為你提供參考。?
參考資料:《ASP.NET Web服務(wù)高級(jí)編程》、《.Net Framework技術(shù)內(nèi)幕》、《ASP.NET分布式數(shù)據(jù)應(yīng)用程序高級(jí)編程》、MSDN在線
一、分布式處理概述?
分布式處理是將應(yīng)用程序邏輯分布到2臺(tái)或者更多臺(tái)計(jì)算機(jī)上,在物理上或邏輯上分離的單元中。這一概念并不是新生事物,在大型工程已經(jīng)得到廣泛使用。只不過(guò),Internet的出現(xiàn)為分布式處理賦予了新的特征,Internet內(nèi)部連接的特性可以讓成百上千的計(jì)算機(jī)為一個(gè)任務(wù)工作,使得在更大規(guī)模上實(shí)施分布式處理成為可能,并跨越了傳統(tǒng)的B/S(客戶機(jī)/服務(wù)器)模型。?
分布式處理思想經(jīng)歷了很長(zhǎng)的過(guò)程,不同IT時(shí)代的開(kāi)發(fā)人員、各級(jí)供應(yīng)商做了大量的工作,使得支持分布式處理的協(xié)議極為豐富。?
1、 DCOM/CORBA?
在.Net Framework之前,基于組件的分布式計(jì)算的主要協(xié)議是CORBA(Common Object Request Broker Architecture,通用對(duì)象請(qǐng)求代理結(jié)構(gòu)),它來(lái)自O(shè)bject Management Group(對(duì)象管理組),還有Microsoft的DCOM(Distributed Component Object Model,分布式組件對(duì)象模型)。?
DCOM是面向連接的。DCOM客戶機(jī)持有對(duì)DCOM服務(wù)器的連接。這種連接方式導(dǎo)致了技術(shù)問(wèn)題存在。例如,客戶機(jī)可能持有引用信息,只有在用戶單擊按鈕時(shí)生成調(diào)用。時(shí)間一長(zhǎng),服務(wù)器就會(huì)因等待客戶機(jī)的請(qǐng)求而空閑。當(dāng)客戶機(jī)崩潰而無(wú)法請(qǐng)求服務(wù)器時(shí),就會(huì)產(chǎn)生嚴(yán)重的后果。另外,在Internet上,DCOM或者CORBA服務(wù)器由數(shù)千臺(tái)客戶機(jī)使用,由于每一臺(tái)客戶機(jī)都有一個(gè)與服務(wù)器的連接,對(duì)于很少使用服務(wù)器或者根本不再使用服務(wù)器的客戶機(jī),應(yīng)該保護(hù)寶貴的服務(wù)器資源。?
盡管DCOM有辦法處理這些問(wèn)題,但是增加了許多復(fù)雜性,這也是Web服務(wù)試圖解決的問(wèn)題之一。?
2、Web 服務(wù)?
隨著Microsoft .Net Framewwork的推出,實(shí)現(xiàn)分布式處理有了新的技術(shù),即Web Service(Web服務(wù))。Web服務(wù)能夠?yàn)榱硪粋€(gè)應(yīng)用程序而不僅僅是瀏覽器提供數(shù)據(jù),并通過(guò)外置數(shù)據(jù)以允許其他的客戶機(jī)使用在同樣的端口和傳輸層都起作用的標(biāo)準(zhǔn)協(xié)議(如HTTP)來(lái)執(zhí)行操作。?
二、Web Service-.Net Framework下的分布式處理技術(shù)?
在.Net Framework中,Web服務(wù)指是以獨(dú)立于平臺(tái)的方式,通過(guò)標(biāo)準(zhǔn)的Web協(xié)議,可以由程序訪問(wèn)的應(yīng)用程序邏輯單元。?
.Net Framework的開(kāi)發(fā)者們將Web服務(wù)定位于基于開(kāi)放的標(biāo)準(zhǔn),能夠用于任何平臺(tái)。使它擁有作為跨平臺(tái)和跨供應(yīng)商的集成技術(shù)的潛力。實(shí)現(xiàn)了Web服務(wù)和Web服務(wù)構(gòu)架后,用戶就可以利用Internet上許多現(xiàn)有技術(shù)。Web服務(wù)成功的關(guān)鍵在于它基于開(kāi)放的標(biāo)準(zhǔn),諸如Microsoft、IBM和Sun等主要供應(yīng)商都支持這些標(biāo)準(zhǔn)。?
1、DCOM/CORBA面臨困難之解決方案--Web服務(wù)?
DCOM和CORBA在使用運(yùn)行于相同平臺(tái)的軟件和緊密管理的局域網(wǎng)創(chuàng)建企業(yè)應(yīng)用程序時(shí)非常優(yōu)秀。但是,他們?cè)趧?chuàng)建跨平臺(tái) 、跨Internet、適應(yīng)Internet的可伸縮性的應(yīng)用程序時(shí)力不從心。他們不是為完成這些目標(biāo)而設(shè)計(jì)的。?
大多數(shù)公司面臨的現(xiàn)實(shí)情況是他們擁有來(lái)自多個(gè)供應(yīng)商的多種平臺(tái)。運(yùn)行于不同平臺(tái)上的應(yīng)用程序系統(tǒng)間通信困難。在與商務(wù)伙伴合作時(shí),基于傳統(tǒng)分布式的架構(gòu)合作困難。?
DCOM和CORBA的問(wèn)題是用戶基本上要依賴一個(gè)供應(yīng)商。如果要使用DCOM,就必須使用Microsoft Windows來(lái)運(yùn)行服務(wù)器和客戶機(jī)。盡管有其他平臺(tái)上的DCOM實(shí)現(xiàn)方式,但是他們未被廣泛采納。雖然CORBA是由多個(gè)供應(yīng)商實(shí)現(xiàn)的規(guī)范,互操作性仍只能以簡(jiǎn)單的方式完成,至于DCOM和CORBA間的集成就不必說(shuō)了。?
從技術(shù)方面看,Web服務(wù)試圖解決使用諸如CORBA和DCOM這樣緊密捆綁的技術(shù)時(shí)遇到的問(wèn)題。這些問(wèn)題包括如何通過(guò)防火墻,協(xié)議的復(fù)雜性,異類平臺(tái)的集成等。?
2、Web服務(wù)在分布式處理中的應(yīng)用?
Web服務(wù)是一種優(yōu)秀的分布式處理技術(shù)。?
下圖演示了在.Net Framework下進(jìn)行分布式處理的一般情形。作為客戶端應(yīng)用程序可以是傳統(tǒng)的Windows Form應(yīng)用程序、基于Web的Asp.net應(yīng)用程序、蜂窩式移動(dòng)應(yīng)用程序等,還可以是另外的Web服務(wù)程序。這些客戶端應(yīng)用程序構(gòu)成N層模型中的表示層(圖中左列)用于數(shù)據(jù)顯示。中間列是中間層,處理商務(wù)邏輯;右列是數(shù)據(jù)層,處理數(shù)據(jù)存儲(chǔ)。?
隨著一個(gè)基于xml的名為簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議SOAP(Simple Object Access Protocol)的不斷標(biāo)準(zhǔn)化,web服務(wù)正成為一個(gè)可以和其他服務(wù)器和應(yīng)用程序交互、可行的方法。?
3、N層模型下客戶機(jī)消費(fèi)Web服務(wù)?
下圖演示了客戶機(jī)消費(fèi)Web服務(wù)的情形。客戶機(jī)可以是一個(gè)Web應(yīng)用程序、另一個(gè)Web服務(wù)、諸如Microsoft Word的字處理程序等。?
Web服務(wù)的消費(fèi)者調(diào)用名為Method()的Web服務(wù)上的方法。實(shí)際調(diào)用向下層傳播,作為Soap消息通過(guò)網(wǎng)絡(luò),并向上層傳播到Web服務(wù)。Web服務(wù)執(zhí)行并響應(yīng)(如果有的話)。?
實(shí)現(xiàn)Web服務(wù)與客戶機(jī)之間的雙向通知或者發(fā)布/訂閱功能是可能的,但是必須手工完成。客戶機(jī)可以實(shí)現(xiàn)自己的Web服務(wù)并在對(duì)服務(wù)器的調(diào)用中傳遞該Web服務(wù)的
?
基于.Net Framework的N層分布式應(yīng)用開(kāi)發(fā)第2部分:
引用。服務(wù)器可以保存引用,然后回調(diào)給客戶機(jī)。?三、基于.Net Framework的N層構(gòu)架設(shè)計(jì)?
面向?qū)ο蟮摹⒒谀K化的組件設(shè)計(jì)需要能夠方便地修改應(yīng)用程序的各個(gè)部分。完成這一目標(biāo)的一種好方法就是在層上工作,將一個(gè)應(yīng)用程序的主要功能分離到不同的層或者級(jí)中。.Net Framework為創(chuàng)建可維護(hù)、可擴(kuò)展的層模式提供了豐富的支持,使得N層夠架取代傳統(tǒng)的客戶機(jī)/服務(wù)器模式而與Internet緊密結(jié)合。?
1、分層模型?
從本質(zhì)上講,層代表了一個(gè)應(yīng)用程序主要的功能。一般地,我們將應(yīng)用程序功能分為三個(gè)方面,對(duì)應(yīng)3層架構(gòu)模式。它們是數(shù)據(jù)層(data layer)、商務(wù)層(business layer)和表示層(presentation layer)。?
數(shù)據(jù)層:包含數(shù)據(jù)存儲(chǔ)和與它交互的組件或服務(wù)。這些組件和服務(wù)在功能上和中間層相互獨(dú)立(盡管在物理上不必一定相互獨(dú)立--它們可以在同一臺(tái)服務(wù)器上)。?
中間層:包括一個(gè)或者多個(gè)組件服務(wù),它們應(yīng)用商務(wù)規(guī)則、實(shí)現(xiàn)應(yīng)用程序邏輯并完成應(yīng)用程序運(yùn)行所需要的數(shù)據(jù)處理。作為這個(gè)過(guò)程的一部分,中間層負(fù)責(zé)處理來(lái)自數(shù)據(jù)存儲(chǔ)或者發(fā)送給數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)。?
表示層:從中間層獲得信息并顯示給用戶。該層同時(shí)也負(fù)責(zé)和用戶進(jìn)行交互,比較返回的信息并將信息回送給中間層進(jìn)行處理。?
可見(jiàn),數(shù)據(jù)層從數(shù)據(jù)庫(kù)中獲得較為原始的數(shù)據(jù),商務(wù)層把數(shù)據(jù)轉(zhuǎn)換成符合商務(wù)規(guī)則的有意義的信息,表示層把信息轉(zhuǎn)換成對(duì)于用戶有意義的內(nèi)容。?
這種分層設(shè)計(jì)方式很有用,因?yàn)槊恳粚佣伎梢元?dú)立地修改。我們可以修改商務(wù)層,不斷地從數(shù)據(jù)層接受相同的數(shù)據(jù),并把這些數(shù)據(jù)傳遞到表示層,而不用擔(dān)心出現(xiàn)歧義。我們也可以修改表示層,使得對(duì)于站點(diǎn)外觀的修改不必改動(dòng)下面的商務(wù)層邏輯。?
2、常用的N層模型設(shè)計(jì)?
已經(jīng)知道,一個(gè)N層應(yīng)用程序中的層不是由運(yùn)行應(yīng)用程序的物理結(jié)構(gòu)(硬件)定義的。層是應(yīng)用程序運(yùn)行的一個(gè)邏輯方面的功能,并定義應(yīng)用程序?qū)?zhí)行的不同的任務(wù)階段。這里的N層設(shè)計(jì)與經(jīng)典的客戶機(jī)/服務(wù)器架構(gòu)截然不同。?
1)、設(shè)計(jì)一個(gè)簡(jiǎn)單的3層?
最簡(jiǎn)單的N層模型就是3層。這里,我們已經(jīng)有一個(gè)被網(wǎng)絡(luò)分隔開(kāi)的服務(wù)器和客戶機(jī)。服務(wù)器中含有數(shù)據(jù)存儲(chǔ)和組成數(shù)據(jù)層的數(shù)據(jù)訪問(wèn)組件,已經(jīng)組成中間層的商務(wù)邏輯。客戶機(jī)作為表示層只需要給應(yīng)用程序提供界面即可。?
在這個(gè)最簡(jiǎn)單的情況中我們或許有一個(gè)關(guān)系數(shù)據(jù)庫(kù)或者一組訪問(wèn)數(shù)據(jù)的組件或者存儲(chǔ)過(guò)程。然后我們應(yīng)當(dāng)有一個(gè)訪問(wèn)組件或者存儲(chǔ)過(guò)程的asp.net頁(yè)面來(lái)提取信息,處理和格式化信息使之適合于特定的客戶機(jī),然后通過(guò)網(wǎng)絡(luò)將信息傳送給客戶機(jī)。客戶機(jī)所要做的事情就是顯示信息、收集用戶的輸入和將信息回送給中間層。?
2)、設(shè)計(jì)一個(gè)更接近現(xiàn)實(shí)的3層?
然而前面的示例只是非常小的應(yīng)用程序的一般情況,現(xiàn)實(shí)世界中很難碰到。數(shù)據(jù)存儲(chǔ)通常位于專門選擇和經(jīng)過(guò)專門設(shè)置的硬件上。它也許是在運(yùn)行SQL Server的基于Windows的一組服務(wù)器上,但是也可能是運(yùn)行非Windows平臺(tái)或Oracle或者其他的數(shù)據(jù)庫(kù)服務(wù)器上。?
在這種情況下,數(shù)據(jù)層和中間層之間的分離就更加顯而易見(jiàn)--它們之間通過(guò)網(wǎng)絡(luò)連接。并且,商務(wù)邏輯被限制在執(zhí)行所有中間層數(shù)據(jù)處理的服務(wù)器上。?
3)、設(shè)計(jì)N層?
很明顯,上面的情況都假定了兩件事:一是客戶機(jī)為一個(gè)低端設(shè)備(因此不參與應(yīng)用程序中所需的實(shí)際數(shù)據(jù)處理);另外就是只有一組商務(wù)規(guī)則。?
然而,這些假設(shè)并不符合實(shí)際的應(yīng)用程序。例如,我們通常期望商務(wù)規(guī)則在其他某個(gè)地方而非在中間層中。在提取數(shù)據(jù)過(guò)程的前期實(shí)現(xiàn)某個(gè)商務(wù)邏輯比較恰當(dāng),當(dāng)然我們也可以在訪問(wèn)數(shù)據(jù)存儲(chǔ)的組件中實(shí)現(xiàn)商務(wù)邏輯。這個(gè)商務(wù)邏輯"包"因此能和數(shù)據(jù)存儲(chǔ)在同一個(gè)服務(wù)器上,或者甚至(在一個(gè)分組的環(huán)境中)在另外一個(gè)中間路由服務(wù)器上。?
另外,為了充分利用"胖客戶機(jī)"的一些性能,以便減少網(wǎng)絡(luò)負(fù)載和因訪問(wèn)路徑循環(huán)而導(dǎo)致的遲滯,我們可以將一些商務(wù)邏輯放在客戶機(jī)上。?
下圖就顯示了這種變化,其中商務(wù)邏輯已經(jīng)從中間層剝離并位于數(shù)據(jù)服務(wù)器或者客戶機(jī)上。?
可見(jiàn),這種模式?jīng)]有中間存儲(chǔ)并且?guī)缀醪恍枰虚g數(shù)據(jù)處理,所以效率更高。?
4)、設(shè)計(jì)一個(gè)更加現(xiàn)實(shí)的N層?
一般地,我們使用一個(gè)或者多個(gè)分離的服務(wù)器來(lái)維持我們正在使用的數(shù)據(jù)存儲(chǔ),這時(shí),商務(wù)邏輯的分布更為分散。下圖顯示了由兩個(gè)網(wǎng)絡(luò)分離的三個(gè)機(jī)器。可以看出,現(xiàn)在的商務(wù)邏輯被分為三個(gè)區(qū):一些將和數(shù)據(jù)存儲(chǔ)運(yùn)行在同一臺(tái)服務(wù)器上,另一些將在中間層服務(wù)器上運(yùn)行,還有一些將在客戶機(jī)上運(yùn)行。?
由此可以看到,準(zhǔn)確定義各個(gè)層并不容易。"中間層"的真正意思是商務(wù)邏輯本身,并且,商務(wù)邏輯的不同元素可以無(wú)可非議地存在于不同的服務(wù)器中。?
3、.Net Framework下的層間(遠(yuǎn)程)傳輸對(duì)象及技術(shù)?
.Net Framework實(shí)現(xiàn)了許多新的技術(shù)以支持多層分布式處理,它提供了豐富的類庫(kù)、對(duì)象及方法使得在不同層(物理上分離或僅僅是邏輯上分離)間的數(shù)據(jù)傳輸更為簡(jiǎn)單。?
1)、支持遠(yuǎn)程數(shù)據(jù)傳送的對(duì)象:?
l ADO.NET DataSet對(duì)象?
l ADO.NET DataTable對(duì)象?
l XmlDocument對(duì)象?
l XmlDataDocument對(duì)象?
2)、支持遠(yuǎn)程數(shù)據(jù)傳送的類/方法:?
l Serialization類?
Serialization類描述了一個(gè)將數(shù)據(jù)轉(zhuǎn)換為一種能復(fù)制到另一個(gè)過(guò)程的格式的對(duì)象的過(guò)程。前面提及的可遠(yuǎn)程傳輸?shù)膶?duì)象具有串行化整個(gè)內(nèi)容的能力,以便它可以通過(guò)一個(gè)通道來(lái)傳送。這個(gè)通道可以直接通過(guò)TCP/IP,或者通過(guò)HTTP。當(dāng)然,它們也可以在另一端解除串行化,因此客戶機(jī)就得到一個(gè)原對(duì)象的完整副本。
?
基于.Net Framework的N層分布式應(yīng)用開(kāi)發(fā)第3部分:
l System.Runtime.Remoting類?System.Runtime.Remoting命名空間提供的對(duì)象可用來(lái)為對(duì)象創(chuàng)建代理以實(shí)現(xiàn)遠(yuǎn)程數(shù)據(jù)傳送。在這種情形下,對(duì)象保留在服務(wù)器上,并且客戶機(jī)只收到一個(gè)代理對(duì)象的引用。這個(gè)代理對(duì)象表示原來(lái)的基于服務(wù)器的對(duì)象(這就是我們?cè)鯓舆h(yuǎn)程使用一個(gè)DataReader的方法),示意如下圖:?
對(duì)于客戶機(jī),這個(gè)代理提供了與原始對(duì)象相同的方法和屬性。然而,當(dāng)客戶機(jī)與代理對(duì)象相互作用時(shí),調(diào)用被自動(dòng)串行化,并通過(guò)通道(網(wǎng)絡(luò))傳送給服務(wù)器上的對(duì)象。然后,任何響應(yīng)和結(jié)果通過(guò)通道被傳送回客戶機(jī)。?
這兩個(gè)遠(yuǎn)程技術(shù)都允許客戶機(jī)使用原來(lái)在服務(wù)器上創(chuàng)建的對(duì)象。我們能夠串行化一個(gè)DataSet對(duì)象或者Xml文檔,同時(shí)我們也能串行化其它的如集合這樣的對(duì)象--比如一個(gè)哈希表(Hashtable)或數(shù)組(Array)。?
4、N層模型中的數(shù)據(jù)處理及對(duì)象選擇?
首先需要考慮的是希望從數(shù)據(jù)存儲(chǔ)中提取出來(lái)的數(shù)據(jù)做些什么?這個(gè)問(wèn)題的答案對(duì)我們所使用對(duì)象的基本選擇的影響將比其他任何事情都要大,甚至在某種程度上定義了我們希望完成任務(wù)的性能的種類。?
1)、只用于顯示的數(shù)據(jù)?
如果只是想以一種固定格式為終端用戶顯示數(shù)據(jù)的話,一般來(lái)說(shuō)根本就沒(méi)有必要遠(yuǎn)程傳輸數(shù)據(jù)。我們沒(méi)有必要在線上將所有的數(shù)據(jù)傳送給客戶機(jī)--我們只能傳給它們客戶設(shè)備能接受的任何格式的最終顯示信息。?
在這種情形中,"Reader"對(duì)象提供了一種只讀的、僅向前的理想且性能最優(yōu)的技術(shù)。當(dāng)與能實(shí)現(xiàn)服務(wù)器端數(shù)據(jù)綁定的服務(wù)器控件一起使用時(shí),我們可以獲得一個(gè)顯示數(shù)據(jù)的高效方法。?
2)、需要遠(yuǎn)程傳輸?shù)臄?shù)據(jù)?
然而,如果我們需要遠(yuǎn)程傳輸數(shù)據(jù)的話則存在一個(gè)問(wèn)題。這些快速而高效的"Reader"對(duì)象只在作為一個(gè)引用時(shí)才能被遠(yuǎn)程傳輸。將一個(gè)DataReader作為引用傳送給一個(gè)客戶機(jī)時(shí),DataReader仍還在服務(wù)器上,不過(guò)客戶機(jī)的應(yīng)用程序也可以使用它。在這種情況下,我們實(shí)際上并沒(méi)有遠(yuǎn)程傳輸數(shù)據(jù),而是使用了一個(gè)遠(yuǎn)程傳輸對(duì)象。在很多情況下都存在這種情況。?
要實(shí)現(xiàn)數(shù)據(jù)的遠(yuǎn)程傳送,應(yīng)該將數(shù)據(jù)寄存到一個(gè)能夠存儲(chǔ)(或保持)數(shù)據(jù)的對(duì)象中。并允許代碼不需進(jìn)入數(shù)據(jù)存儲(chǔ)的額外行程就可以根據(jù)需要提取數(shù)據(jù),并且多次讀取。在ADO.NET中,這個(gè)對(duì)象就是DataSet對(duì)象(或者DataTable對(duì)象)。當(dāng)使用xml時(shí),也有幾個(gè)對(duì)象供選擇。我們能夠遠(yuǎn)程傳輸XmlDocument和XmlDataDocument對(duì)象。這兩個(gè)對(duì)象都有保持內(nèi)容的能力,并且可以在一個(gè)應(yīng)用程序的層之間進(jìn)行傳送。?
四、N層分布式數(shù)據(jù)處理架構(gòu)模型?
要進(jìn)一步理解怎樣在應(yīng)用程序中劃分不同的層,需要確定數(shù)據(jù)如何顯示以及是否需要更新數(shù)據(jù)和向服務(wù)器及時(shí)返回更新。?
1、全部在服務(wù)器上完成顯示?
在客戶機(jī)上顯示數(shù)據(jù),最常見(jiàn)的情形是在一組或者多組服務(wù)器上執(zhí)行所有的數(shù)據(jù)處理。數(shù)據(jù)層和中間層限于服務(wù)器,客戶機(jī)只提供顯示接口。對(duì)于一個(gè)web瀏覽器來(lái)說(shuō),通常的格式為html,對(duì)于一個(gè)蜂窩式電話或類似設(shè)備來(lái)說(shuō),可能是以wml格式表示,等等。?
下圖使用一個(gè)存儲(chǔ)過(guò)程或SQL語(yǔ)句來(lái)提取所需要的數(shù)據(jù),然后用asp.net進(jìn)行處理,或者執(zhí)行一個(gè)web服務(wù)。另外,這里也用xml片段的形式從數(shù)據(jù)存儲(chǔ)中提取數(shù)據(jù),然后對(duì)數(shù)據(jù)進(jìn)行處理并提供給客戶機(jī)。?
如果以xml文檔形式存儲(chǔ)數(shù)據(jù),或者以這樣一種格式存儲(chǔ)數(shù)據(jù):數(shù)據(jù)作為xml外置數(shù)據(jù)層,那么我們就有一些其他的選擇。?
下圖顯示了怎樣提取和處理xml數(shù)據(jù)以便傳送給客戶機(jī)使用。此外,數(shù)據(jù)的提取其實(shí)就是借助一個(gè)"Reader"對(duì)象,并且可以使用不同的技術(shù)來(lái)處理數(shù)據(jù)并將數(shù)據(jù)提供給客戶機(jī)。
2、擴(kuò)展中間層?
雖然數(shù)據(jù)的提取和處理經(jīng)常在一個(gè)對(duì)象里發(fā)生,比如一個(gè)Asp.Net頁(yè)面,但是為了有效利用由于使用基于組件的設(shè)計(jì)而提供的好處,通常需要提供更為精細(xì)的架構(gòu)。我們應(yīng)該有在顯示數(shù)據(jù)或者將其傳送給客戶機(jī)之前應(yīng)用于數(shù)據(jù)的商務(wù)規(guī)則。換句話說(shuō),它可能是因?yàn)榘踩脑?#xff0c;也可能是為了實(shí)現(xiàn)分布式處理,或者只是提供可重用性和使應(yīng)用程序的維護(hù)更加容易。?
例如,應(yīng)該有訪問(wèn)一個(gè)數(shù)據(jù)存儲(chǔ)并提取一系列消費(fèi)者的多個(gè)頁(yè)面。通過(guò)在一個(gè)獨(dú)立于asp.net頁(yè)面或其他提供數(shù)據(jù)給客戶機(jī)的對(duì)象的組件中建立這個(gè)過(guò)程,我們能夠提供一個(gè)提取數(shù)據(jù)的層。然后,我們?cè)趯?lái)需要在某些方面改變數(shù)據(jù)存儲(chǔ)或者數(shù)據(jù)結(jié)構(gòu),或者改變?cè)L問(wèn)它的規(guī)則,我們只要用一個(gè)新的版本替換組件即可。?
只要組件的接口仍然未變,所有使用這個(gè)接口的應(yīng)用程序?qū)⒖吹絹?lái)自組件的相同輸出并和以前一樣繼續(xù)運(yùn)行。然而,組件在內(nèi)部用來(lái)提取和處理來(lái)自數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)的方法可以根據(jù)需要進(jìn)行相應(yīng)修改。下圖示意了這種架構(gòu)。?
顯然,該過(guò)程可以使用多個(gè)組件。如果數(shù)據(jù)的提取相當(dāng)復(fù)雜,或者同一數(shù)據(jù)運(yùn)用在多個(gè)地方的話,進(jìn)一步分解數(shù)據(jù)處理(分解為更多組件層)就很有意義。例如,可用一個(gè)組件將數(shù)據(jù)當(dāng)作一系列包含所有必須列的行(以關(guān)鍵字順序排列),這個(gè)組件就可以成為其他以不同順序存儲(chǔ)數(shù)據(jù)的組件,或者僅外置數(shù)據(jù)的某些列的組件的數(shù)據(jù)源。?
3、移動(dòng)數(shù)據(jù)處理到客戶機(jī)?
一般地,要獲得發(fā)送給客戶機(jī)的數(shù)據(jù),我們將利用客戶端腳本(JavaScript或 VBScript以及 WMLScript)、用Java或者一個(gè)特定平臺(tái)的語(yǔ)言書(shū)寫(xiě)的客戶端組件,或者用諸如Visual Basic 6.0、C++、Delphi等語(yǔ)言書(shū)寫(xiě)的客戶端可執(zhí)行程序等等。當(dāng)然,所有我們需要的功能都是.Net Framework的一部分。(用戶可通過(guò)下載和安裝可重新分配的Framework(大約5MB)在客戶機(jī)上使用Framework)。?
因此,下面的示意圖顯示了一些用于實(shí)現(xiàn)獲得發(fā)送給客戶機(jī)的數(shù)據(jù)并在客戶機(jī)上進(jìn)行處理的方法。?
?
基于.Net Framework的N層分布式應(yīng)用開(kāi)發(fā)第4部分:
4、將更新回送給服務(wù)器?
在許多情況下,如果我們的要求就是以一種盡可能快速和高效的方式獲得發(fā)送給客戶機(jī)的依據(jù),那么,上面的示例能很好地完成任務(wù)。然而,許多應(yīng)用程序要求客戶機(jī)將數(shù)據(jù)回送以更新數(shù)據(jù)存儲(chǔ)等操作時(shí),就需要尋找更合理的模式。?
至少有三種方法用于向服務(wù)器端回送數(shù)據(jù)。一是回送Html表單和查詢字符串(實(shí)現(xiàn)方式與以前的ASP類似);另一是客戶端組件(例如IE5及以上版本的XMLHTTP組件);還有就是客戶端可執(zhí)行的Windows表單應(yīng)用程序和服務(wù)等。?
因此,應(yīng)該有這樣一種情況:客戶機(jī)僅僅要求我們發(fā)送一些數(shù)據(jù),并且我們讓客戶機(jī)完成所有的數(shù)據(jù)處理。也就是說(shuō),客戶機(jī)充當(dāng)某種類型的服務(wù),它將應(yīng)用程序的數(shù)據(jù)作為自己的源數(shù)據(jù)來(lái)使用,然后在它的客戶機(jī)已經(jīng)處理數(shù)據(jù)后將更改提交回來(lái)。?
一旦客戶端完成了數(shù)據(jù)更新,或者已經(jīng)收集了用戶輸入的新數(shù)據(jù),客戶機(jī)應(yīng)用程序就以一種合適的格式打包數(shù)據(jù)(或者用正確的技術(shù)整理數(shù)據(jù)),并將它提交給服務(wù)器進(jìn)行處理和存儲(chǔ)。?
下圖顯示了利用"胖客戶機(jī)"來(lái)實(shí)現(xiàn)這種架構(gòu)的方法,其中數(shù)據(jù)在客戶機(jī)上進(jìn)行處理,然后經(jīng)整理后返回給服務(wù)器來(lái)更新原始的數(shù)據(jù)存儲(chǔ)。?
仍然地,這不是一個(gè)包含所有可能性的圖表。回送數(shù)據(jù)的方法或許和發(fā)送數(shù)據(jù)的方法沒(méi)有什么聯(lián)系。你應(yīng)該根據(jù)應(yīng)用程序的實(shí)際需求設(shè)計(jì)合適的模型。?
五、結(jié)束語(yǔ)?
建立可維護(hù)、可擴(kuò)展的站點(diǎn),開(kāi)發(fā)高效率、高伸縮性的應(yīng)用程序、實(shí)現(xiàn)跨平臺(tái)、跨Internet的應(yīng)用集成、創(chuàng)建N層分布式應(yīng)用程序是擺在無(wú)數(shù)開(kāi)發(fā)者面前的任務(wù)。傳統(tǒng)開(kāi)發(fā)方式及技術(shù)面臨了困難。?
.Net Framework推出的許多新技術(shù)為這些任務(wù)的實(shí)現(xiàn)提供了相對(duì)簡(jiǎn)單的解決方案。其中,基于SOAP的Web Service在處理分布式應(yīng)用時(shí)具有比傳統(tǒng)的DCOM/CORBA明顯的優(yōu)點(diǎn),結(jié)合基于Web的ASP.NET頁(yè)面開(kāi)發(fā)技術(shù)和SQLServer數(shù)據(jù)存儲(chǔ)技術(shù)(或Xml文檔),在.Net下開(kāi)發(fā)N層應(yīng)用程序也不再困難。?
要很好地完成以上任務(wù),你需要根據(jù)實(shí)際情況設(shè)計(jì)合理的應(yīng)用程序架構(gòu)模型。本文正是為了在這方面為你提供參考。?
參考資料:《ASP.NET Web服務(wù)高級(jí)編程》、《.Net Framework技術(shù)內(nèi)幕》、《ASP.NET分布式數(shù)據(jù)應(yīng)用程序高級(jí)編程》、MSDN在線
?
相關(guān)資料:
轉(zhuǎn)載于:https://www.cnblogs.com/liangxiaofeng/p/5679837.html
總結(jié)
以上是生活随笔為你收集整理的asp.net 分布式应用开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: input type:text输入框点击
- 下一篇: asp.net+mvc+easyui+s