監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢(xún)管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 甲方項(xiàng)目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉

微軟基于Web計(jì)算的框架結(jié)構(gòu)分析

申請(qǐng)免費(fèi)試用、咨詢(xún)電話:400-8352-114

AMTeam.org

微軟基于Web計(jì)算的框架結(jié)構(gòu)分析


 
一、引言

隨著Internet的發(fā)展,軟件系統(tǒng)已經(jīng)從客戶服務(wù)器系統(tǒng)發(fā)展到服務(wù)器/瀏覽器系統(tǒng),但是隨著基于Internet應(yīng)用的深化和基于Web計(jì)算的概念的提出,新的計(jì)算模型不再是簡(jiǎn)單的依賴(lài)于瀏覽器作為客戶端。

首先,我們來(lái)簡(jiǎn)單看一下計(jì)算模型的發(fā)展歷史,一開(kāi)始,由于個(gè)人計(jì)算機(jī)還尚未普及,而且計(jì)算機(jī)價(jià)格都比較昂貴,我們一般采用主機(jī)模式來(lái)進(jìn)行計(jì)算,也就是說(shuō)客戶實(shí)際上是通過(guò)終端和大型主機(jī)進(jìn)行連接,主機(jī)分配一定的CPU時(shí)間和磁盤(pán)空間給用戶,所有用戶的計(jì)算實(shí)際上都是在主機(jī)上完成的。這樣對(duì)主機(jī)的要求非常高,要求主機(jī)上的操作系統(tǒng)必須是高度可靠、安全的。在這個(gè)時(shí)候,流行的是IBM的大型機(jī)的操作系統(tǒng),這里注意的是,即使到現(xiàn)在,很多銀行依然通過(guò)這個(gè)模式進(jìn)行運(yùn)做,因?yàn)槿菀走M(jìn)行集中管理和維護(hù),客戶端實(shí)際上僅僅是一個(gè)終端的功能,從某一個(gè)角度講就是主機(jī)屏幕的延伸。

隨著分布式概念的提出和微機(jī)功能的增強(qiáng),軟件業(yè)又提出了客戶/服務(wù)器的計(jì)算模型,把一些非關(guān)鍵的任務(wù)(比如圖形界面的顯示,數(shù)據(jù)的顯示格式確定,數(shù)據(jù)的處理等等)放到客戶端進(jìn)行執(zhí)行,這樣相對(duì)就減輕了對(duì)服務(wù)器的負(fù)擔(dān)。但是這種模式一般是基于局域網(wǎng)范圍內(nèi)進(jìn)行的(比如在九十年代非常流行的一些基于數(shù)據(jù)庫(kù)的信息系統(tǒng)就是根據(jù)這種模式構(gòu)建的)。

隨著Internet的發(fā)展和企業(yè)之間電子交互的需求的出現(xiàn),出現(xiàn)了基于數(shù)據(jù)庫(kù)/Web服務(wù)器/瀏覽器這樣的計(jì)算模型,這種模型實(shí)際上是基于全球網(wǎng)絡(luò)范圍內(nèi)進(jìn)行的,客戶端統(tǒng)一的以瀏覽器的形式表現(xiàn)給用戶,用戶通過(guò)HTTP協(xié)議把任務(wù)提交給Web服務(wù)器,Web服務(wù)器通過(guò)和數(shù)據(jù)庫(kù)和應(yīng)用服務(wù)器的交互把結(jié)果通過(guò)HTTP協(xié)議傳遞給客戶端,然后客戶端再通過(guò)瀏覽器顯示結(jié)果。在這種模式下的關(guān)鍵是數(shù)據(jù)傳遞的安全性和事務(wù)性這兩個(gè)問(wèn)題,因?yàn)镠TTP本質(zhì)是是一個(gè)無(wú)狀態(tài)的連接,所以事務(wù)處理就變得非常重要,同時(shí)因?yàn)檎麄€(gè)業(yè)務(wù)是基于全球網(wǎng)絡(luò)體系結(jié)構(gòu)的,所以安全性也變成一個(gè)值得關(guān)注的問(wèn)題。

隨著Internet上計(jì)算任務(wù)的復(fù)雜化和業(yè)務(wù)的多樣化,自然而然就產(chǎn)生了以Web為中心進(jìn)行計(jì)算的需求。從本質(zhì)上說(shuō),對(duì)Internet應(yīng)用的復(fù)雜化使我們當(dāng)前的操作系統(tǒng)都顯得力不從心,因?yàn)槲覀儺?dāng)前的操作系統(tǒng)一般都是基于單機(jī)或者局域網(wǎng)系統(tǒng)的,而如何把操作系統(tǒng)擴(kuò)展到整個(gè)Internet計(jì)算這個(gè)范疇內(nèi),就成了所有操作系統(tǒng)軟件生產(chǎn)廠商所必須考慮的問(wèn)題。

基于Web的軟件系統(tǒng)的例子有很多,比如Napster,它允許在用戶之間進(jìn)行磁盤(pán)內(nèi)容的共享,從某一種角度講,它的基本概念是要建立一個(gè)基于Web的文件系統(tǒng),這個(gè)文件系統(tǒng)包含了所有參與者本身的文件系統(tǒng)。這樣參與者之間就可以進(jìn)行文件的共享,通過(guò)輸入一定的查詢(xún)條件,我們就可以在其他的用戶的存儲(chǔ)設(shè)備上找到相應(yīng)的文件并進(jìn)行下載(當(dāng)然這種概念在局域網(wǎng)中早就存在,現(xiàn)在Napster把這個(gè)概念擴(kuò)展到了整個(gè)Internet領(lǐng)域而已)。

二、Web服務(wù)體系結(jié)構(gòu)分析

這種基于Internet類(lèi)型應(yīng)用的出現(xiàn)使我們需要一個(gè)嶄新的框架結(jié)構(gòu)來(lái)進(jìn)行程序的設(shè)計(jì),我們需要一個(gè)快速和方便的方法進(jìn)行代碼的編寫(xiě)并且能夠和Internet上其他的程序進(jìn)行交互。當(dāng)然在計(jì)算機(jī)之間進(jìn)行數(shù)據(jù)和信息交互這個(gè)概念并不是很新,比如通過(guò)RPC,DCOM和CORBA等都可以實(shí)現(xiàn)不同計(jì)算機(jī)上的進(jìn)程之間的交互。但是它們都有一個(gè)致命的缺點(diǎn):它們需要進(jìn)行交互的機(jī)器具有相似的系統(tǒng),比如MSMQ只能和MSMQ進(jìn)行對(duì)話,DCOM客戶端只能和DCOM服務(wù)器端進(jìn)行交互。

而我們真正需要的是一個(gè)通用的開(kāi)發(fā)框架,也就是說(shuō)不管系統(tǒng)的那一端是什么東西,我們這一端都可以和它進(jìn)行信息的交互。它的本質(zhì)意義就是說(shuō)兩端的操作系統(tǒng)不僅可以是異構(gòu)的(比如一端可以是Windows,另一端可以是UNIX),而且實(shí)現(xiàn)的語(yǔ)言也可以是異構(gòu)的(一端可以用C++實(shí)現(xiàn),另一端可以用VB實(shí)現(xiàn))。

如果大家還記得在DCOM進(jìn)行交互時(shí)的數(shù)據(jù)列集(Marshal)這個(gè)概念的話,那么就可以理解基于Internet異構(gòu)系統(tǒng)通訊的關(guān)鍵點(diǎn)是什么了。一個(gè)就是通訊的標(biāo)準(zhǔn),兩個(gè)進(jìn)程需要采用標(biāo)準(zhǔn)的協(xié)議進(jìn)行通訊,另外一個(gè)就是數(shù)據(jù)的打包,數(shù)據(jù)應(yīng)該采用一致的形式進(jìn)行打包和解包。當(dāng)前基于Internet最流行的傳輸協(xié)議就是HTTP,所有的Web瀏覽器都通過(guò)這個(gè)協(xié)議和Web服務(wù)器進(jìn)行通訊并得到相關(guān)的網(wǎng)頁(yè)。而數(shù)據(jù)的打包也需要采用一定的標(biāo)準(zhǔn),當(dāng)前出現(xiàn)的跨平臺(tái)的信息編碼的標(biāo)準(zhǔn)就是XML。因?yàn)镠TTP和XML都是工業(yè)的標(biāo)準(zhǔn),并不和任何平臺(tái),廠商掛鉤,所以基于這兩種標(biāo)準(zhǔn)構(gòu)建的系統(tǒng)無(wú)疑在任何環(huán)境是都是有生命力的。

為了創(chuàng)建一個(gè)Web服務(wù),我們所需要做的工作就是編寫(xiě)一個(gè).Net服務(wù)對(duì)象,使它被異地進(jìn)程的調(diào)用就象能夠被本地的客戶端直接調(diào)用一樣。實(shí)際上是通過(guò)給它標(biāo)記一定的屬性來(lái)實(shí)現(xiàn)的,使它能夠被Web客戶端所使用。通過(guò)ASP.NET,這個(gè).Net服務(wù)對(duì)象就能夠接受來(lái)自客戶端的請(qǐng)求(通過(guò)HTTP協(xié)議傳輸?shù)模R簿褪钦f(shuō).Net服務(wù)對(duì)象能夠和任何使用HTTP和XML標(biāo)準(zhǔn)的進(jìn)程進(jìn)行通訊,你也不需要考慮Web通訊的體系結(jié)構(gòu),操作系統(tǒng)已經(jīng)幫你搞定了這一切。

從服務(wù)對(duì)象的角度來(lái)講,一個(gè)客戶和服務(wù)對(duì)象之間的通訊可以用下面的形式表示:

1. 從客戶端的HTTP請(qǐng)求到達(dá),其中參數(shù)可能包含在URL中,也可能包含在一個(gè)單獨(dú)的XML文件中
  
2. ASP.NET根據(jù).asmx文件的指定創(chuàng)建對(duì)象

3. ASP.NET調(diào)用對(duì)象的某一個(gè)特定的方法

4. 對(duì)象把結(jié)果返回給ASP.NET

在客戶端,.NET提供了Proxy類(lèi)用來(lái)快速方便的和服務(wù)器提供的Web服務(wù)進(jìn)行交互,通過(guò)開(kāi)發(fā)工具得到Web服務(wù)的描述,然后就可以產(chǎn)生一個(gè)包含一些功能函數(shù)的Proxy類(lèi),注意,在這里我們可以使用任何類(lèi)型的語(yǔ)言來(lái)開(kāi)發(fā)客戶端,當(dāng)客戶端調(diào)用其中的某一個(gè)函數(shù)的時(shí)候,Proxy就會(huì)產(chǎn)生一個(gè)HTTP請(qǐng)求并把它發(fā)送給服務(wù)器,當(dāng)服務(wù)器響應(yīng)返回的時(shí)候,Proxy能夠?qū)Y(jié)果進(jìn)行解析并返回給調(diào)用該函數(shù)的客戶端。這樣,就保證了客戶端能夠通過(guò)HTTP和XML無(wú)縫的和Web服務(wù)器進(jìn)行信息的交互。

從客戶端的角度來(lái)講,一個(gè)客戶和服務(wù)對(duì)象之間的通訊可以用下面的形式表示:

1. 在運(yùn)行時(shí)刻,客戶端產(chǎn)生一個(gè)Proxy對(duì)象

2. 客戶端調(diào)用Proxy中的一個(gè)方法

3. Proxy把調(diào)用轉(zhuǎn)換成HTTP和XML形式,并通過(guò)Internet發(fā)送到服務(wù)器端

4. Proxy通過(guò)HTTP協(xié)議得到以XML形式表現(xiàn)的結(jié)果,并轉(zhuǎn)化成相應(yīng)的結(jié)果值返回給客戶

三、Web服務(wù)的編寫(xiě)

這里我們可以寫(xiě)一個(gè)最簡(jiǎn)單的Web服務(wù)來(lái)說(shuō)明這種新技術(shù)的使用,該Web服務(wù)以字符串的形式提供當(dāng)前的服務(wù)器的時(shí)間(可以精確也可以不精確到秒)。程序是以標(biāo)準(zhǔn)的標(biāo)記符"<%@...%>"開(kāi)始的,在該標(biāo)記符內(nèi),WebService告訴ASP.NET該頁(yè)的代碼是作為一個(gè)Web服務(wù)出現(xiàn)的。Language告訴ASP編譯這個(gè)頁(yè)所使用的語(yǔ)言是VB,然后ASP.NET就會(huì)使用Visual Basic.NET來(lái)進(jìn)行代碼的編譯。CLASS屬性告訴ASP.NET當(dāng)前類(lèi)對(duì)象的名稱(chēng)為T(mén)imeService。

具體的代碼如下:

<%@ WebService Language="VB" Class="TimeService"%>

' 引入名字空間' 需要Web Service
 
Imports System
 
Imports System.Web.Services
 
' 建立一個(gè)新的類(lèi),該類(lèi)必須繼承系統(tǒng)提供的基類(lèi)WebService
 
Public Class TimeService : Inherits WebService
  
'在類(lèi)中建立我們所需要的函數(shù),并標(biāo)記為WebMethods
  
Public Function <WebMethod()> GetTime (ShowSeconds as Boolean) As String
  
' 完成該函數(shù)的功能:發(fā)現(xiàn)當(dāng)前的時(shí)間,格式化,并以字符串形式返回
   
Dim dt as DateTime
   
If (ShowSeconds = TRUE) Then
    
GetTime = dt.Now.ToLongTimeString
   
Else
    
GetTime = dt.Now.ToShortTimeString
   
Endif
  
End Function

End Class

為了允許開(kāi)發(fā)人員使用Web服務(wù)來(lái)開(kāi)發(fā)客戶端應(yīng)用,需要在設(shè)計(jì)和開(kāi)發(fā)的時(shí)候給他們提供一定的信息。比如,一個(gè)Web服務(wù)的客戶端需要知道Web服務(wù)所暴露的方法和相關(guān)的參數(shù)以及所支持的協(xié)議,這個(gè)和一個(gè)標(biāo)準(zhǔn)的COM所攜帶的類(lèi)型庫(kù)的概念很類(lèi)似。但是類(lèi)型庫(kù)是COM所專(zhuān)用的,而我們所提供的方法應(yīng)該是和具體的體系結(jié)構(gòu)無(wú)關(guān)的,所以需要編寫(xiě)一個(gè)通用的服務(wù)方法的描述。ASP.NET提供了一個(gè)可描述的服務(wù),當(dāng)編譯一個(gè)WEB服務(wù)的時(shí)候,ASP.NET提供了一個(gè)文件列表用來(lái)說(shuō)明服務(wù)所支持的協(xié)議,它所提供的方法和參數(shù)等等。這個(gè)文件是 XML形式編碼并使用稱(chēng)為SDL(Service Descriptor Language)的語(yǔ)言進(jìn)行描述的??梢酝ㄟ^(guò)http://WebServer/ specifiedDirectory /TimeService.asmx?SDL這樣的形式來(lái)得到SDL語(yǔ)言。

當(dāng)我們用VB或者VC來(lái)編寫(xiě)COM組件的時(shí)候,我們一般需要編寫(xiě)一個(gè)類(lèi)型庫(kù)來(lái)描述該COM組件所能提供的功能,而對(duì)ASP.NET來(lái)說(shuō),它能夠自動(dòng)的生成一個(gè)SDL文件,也可以先編寫(xiě)一個(gè)SDL文件,然后通過(guò)系統(tǒng)工具生成一個(gè)服務(wù)的模板文件。

一個(gè)典型的SDL文件具體內(nèi)容如下:

<!-- 標(biāo)準(zhǔn)的XML頭,描述版本信息和其他相關(guān)信息-->

<?xml version="1.0"?>

<!-- 元素serviceDescription是文件的根節(jié)點(diǎn),里面的內(nèi)容是對(duì)Web服務(wù)的描述 -->

<!-- 值TimeService表示服務(wù)的名稱(chēng) -->

<serviceDescription name="TimeService">

<!-- 元素serviceDescription包括兩個(gè)子元素,一個(gè)是協(xié)議描述,另外一個(gè)是文檔的schema描述 -->

<!-協(xié)議描述用來(lái)告訴客戶端開(kāi)發(fā)人員我這個(gè)Web服務(wù)所支持的協(xié)議,并告訴他請(qǐng)求和響應(yīng)數(shù)據(jù)的編碼格式 -->

<!-這里我們描述了HTTP GET的操作,一般有三種方法HTTP GET,HTTP POST和SOAP三種方法 -->

<httpget>

<service>
 
<requestResponse name="GetTime" href="
http://WebServer/specifiedDirectory/TimeService.asmx/GetTime">
   
<request>
   
<param name="ShowSeconds"/>
  
</request>
  
<response>
   
<mimeXml ref="s1:string"/>
  
</response>
 
</requestResponse>

</service>

</httpget>

<!- 這里可以對(duì)其他的協(xié)議進(jìn)行描述,比如httpget 和 soap ->

<!- schema表示對(duì)服務(wù)的抽象定義,它和采用什么協(xié)議和它進(jìn)行通訊無(wú)關(guān) ->

<!- 它實(shí)際上包含了對(duì)服務(wù)包含的函數(shù)的名稱(chēng),參數(shù)和返回值的表示 ->

<schema>

<element name="GetTime">
 
<complexType>
  
<element name="ShowSeconds" type="boolean"/>
 
</complexType>

</element>
 
<element name="GetTimeResult">
  
<complexType>
   
<element name="result" type="string" nullable="true"/>
  
</complexType>
 
</element>

</schema>

</serviceDescription>

四、Web服務(wù)的客戶端的編寫(xiě)

現(xiàn)在讓我們來(lái)看一下如何編寫(xiě)客戶端的代碼。我們知道ASP.NET實(shí)際上是在偵聽(tīng)三種類(lèi)型的數(shù)據(jù)包,它們包括HTTP GET,HTTP POST和SOAP。

1.采用HTTP GET的方法:

其基本格式如下:

http://webserver/specifiedDirectory/timeservice.asmx/GetTime?ShowSeconds=TRUE

2.采用HTTP POST的方法:

實(shí)際上就是通過(guò)HTML的FORM格式來(lái)發(fā)送請(qǐng)求,其主要的代碼如下

<form METHOD="POST" ACTION=" http://webserver/specifiedDirectory/timeservice.asmx/GetTime">

<p>是否顯示秒?</p>

<blockquote>

<p> <input TYPE="RADIO" NAME="ShowSeconds" VALUE="True" CHECKED>

True

<input TYPE="RADIO" NAME="ShowSeconds" VALUE="False">False<br>

</p> </blockquote>

<input TYPE="SUBMIT" VALUE="Submit Form">

<input TYPE="RESET" VALUE="Reset Form">

</form>

3.采用SOAP的方法:

服務(wù)器接受通過(guò)HTTP POST請(qǐng)求發(fā)送的數(shù)據(jù)包,數(shù)據(jù)包以一個(gè)SOAP包的格式保存。注意這里的SOAP包實(shí)際上是一個(gè)XML文檔,SOAP包中包含了函數(shù)的名稱(chēng)和相關(guān)的參數(shù),當(dāng)SOAP包達(dá)到服務(wù)器的時(shí)候,APS.NET可以識(shí)別這個(gè)SOAP包,然后提取包中所包含的方法和相應(yīng)的參數(shù)并創(chuàng)建這個(gè)對(duì)象,然后執(zhí)行對(duì)該方法的調(diào)用。并把結(jié)果以XML文檔的形式返回到客戶端。這里的關(guān)鍵是合成一個(gè)有效的SOAP包,并對(duì)返回的XML文檔進(jìn)行有效的信息提取。

這里我們可以用如下的VB代碼來(lái)實(shí)現(xiàn)基于SOAP的客戶端。

Private Const QuoteTemplate =

"<?xml version=""1.0""?>

<Envelope xmlns = ""
http://schemas.xmlsoap.org/soap/envelope/"" >

<Body>

<GetTime xmlns:xsi=""
http://www.w3.org/1999/XMLSchema-instance"" xmlns=""http://tempuri.org/main.xsd"">

<ShowSeconds>true</ShowSeconds>

</GetTime>

</Body>

</Envelope>"

Private Sub btnGetTime_Click()

' 建立DOM對(duì)象
 
Dim parser As New DOMDocument
 
' 裝載XML文檔模板
 
parser.loadXML (QuoteTemplate)
 
' 設(shè)置參數(shù)ShowSeconds的值
 
If (Check1.Value = 0) Then
  
parser.selectSingleNode("/Envelope/Body/GetTime/ShowSeconds").Text = "false"
 
Else
  
parser.selectSingleNode("/Envelope/Body/GetTime/ShowSeconds").Text = "true"
 
End If

' 把XML文檔的內(nèi)容放到EDIT控件txtSend中
 
txtSent.Text = parser.xml
 
' 使用Microsoft Internet transfer 控件執(zhí)行HTPP POST操作
 
Inet1.Execute txtURL.Text, "POST", parser.xml, "Content-Type: text/xml" + vbCr + vbLf +"SOAPAction:
http://tempuri.org/GetTime"
 
End Sub

' 控件Inetl1的消息觸發(fā)處理

Private Sub Inet1_StateChanged(ByVal State As Integer)

If (State = 12) Then

' 讀取從服務(wù)器端返回的數(shù)據(jù)
  
Dim bar As String
  
bar = Inet1.GetChunk(4096)
  
' 把服務(wù)器端返回的數(shù)據(jù)存放到EDIT控件txtReceived中
  
txtReceived.Text = bar
  
' 把返回的字符串存放到XML文檔中
  
Dim DocIn As New DOMDocument
  
DocIn.loadXML (bar)
  
' 利用DOM模型得到元素price的值
  
Dim Price As IXMLDOMNode
  
Set Price = DocIn.selectSingleNode("SOAP:Envelope/SOAP:Body/GetStockQuoteResponse/price")
  
If (Price Is Nothing) Then
   
txtPrice = "(error)"
  
Else
   
txtPrice = Price.Text
  
End If
 
End If

End Sub

4.通過(guò)智能的SOAP代理進(jìn)行操作

這種方法需要使用Visual Studio.NET開(kāi)發(fā)工具,程序通過(guò)SDL文件讀取對(duì)Web服務(wù)的描述并產(chǎn)生一個(gè)Proxy(注意這個(gè)Proxy可以使用一定的工具自動(dòng)產(chǎn)生),該P(yáng)roxy繼承了基類(lèi)Web.Services.Protocols.SoapClientProtocol。Proxy類(lèi)包含了一個(gè)屬性稱(chēng)為Path,這個(gè)屬性指出服務(wù)器的URL地址,它包含一個(gè)從SDL文件中得到的缺省的值,客戶端通過(guò)方法Invoke來(lái)激活Proxy中的方法(比如A),該方法(A)然后創(chuàng)建一個(gè)SOAP包,包中包含了方法的名稱(chēng)和參數(shù),然后通過(guò)HTTP協(xié)議把它發(fā)送給服務(wù)器。當(dāng)SOAP響應(yīng)包從服務(wù)器中返回的時(shí)候,基類(lèi)就對(duì)返回的值進(jìn)行解析并把它返回給Proxy,再由Proxy返回給客戶。然后你可以使用具體的語(yǔ)言來(lái)操作這個(gè)Proxy,當(dāng)前支持的語(yǔ)言有Visual Baisc.NET,C#和JavaScript,但不支持C++。

下面是用VB.NET編寫(xiě)的和Proxy進(jìn)行交互的代碼:

Public Class Form1 Inherits System.WinForms.Form
 
' 當(dāng)點(diǎn)擊按紐GetTimeSynch時(shí)的處理(同步處理)
 
Protected Sub btnGetTimeSynch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
 
' 產(chǎn)生一個(gè)新的Proxy類(lèi)的對(duì)象實(shí)例
  
Dim ThisTimeServiceProxy As New TimeService()
  
' 設(shè)置由用戶指定的屬性Path的值
  
ThisTimeServiceProxy.Path = TextBox2.Text
  
' 實(shí)際調(diào)用方法,并把結(jié)果返回到文本框中
  
' CheckBox1的值表示方法GetTime的參數(shù)值
  
TextBox1.Text = ThisTimeServiceProxy.GetTime(CheckBox1.Checked)
 
End Sub

Dim AsyncTimeServiceProxy As TimeService
 
Dim AsyncResult As IAsyncResult
 
' 當(dāng)點(diǎn)擊按紐GetTimeASynch時(shí)的處理(異步處理)
 
Protected Sub btn_BeginGetTimeAsync_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

AsyncTimeServiceProxy = New TimeService

AsyncResult = AsyncTimeServiceProxy.BeginGetTime(CheckBox1.Checked, Nothing, Nothing)
 
End Sub

' 檢查當(dāng)前的操作是否結(jié)束
 
Protected Sub btnPollForComplete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
  
If (AsyncResult.IsCompleted) Then
   
MsgBox("Complete")
  
Else
   
MsgBox("Not Complete")
  
End If
 
End Sub

' 得到采用異步方法調(diào)用所得到的結(jié)果

Protected Sub btnEndGetTimeAsync_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
  
TextBox1.text = AsyncTimeServiceProxy.EndGetTime(AsyncResult)
  
AsyncTimeServiceProxy = Nothing

End Sub

End Class

我們知道,基于Internet的計(jì)算環(huán)境要比基于桌面的環(huán)境要復(fù)雜的多,而且交互時(shí)間也要長(zhǎng)的多,比如對(duì)一個(gè)最簡(jiǎn)單的Web服務(wù)的調(diào)用可能就要花費(fèi)5到10秒甚至更長(zhǎng)的時(shí)間,而在這個(gè)時(shí)候你不能指望用戶愿意傻乎乎的一直等在那里。換句話說(shuō),因?yàn)樽烂娼换r(shí)間非常短,我們可以采用同步調(diào)用的方法來(lái)調(diào)用組件的一個(gè)方法,但是在基于Internet計(jì)算的時(shí)候,我們必須采用異步調(diào)用的方法。

上面的VB.NET代碼中也演示了異步調(diào)用的方法,實(shí)際上Proxy本身就包含了一個(gè)方法稱(chēng)為Beginmethodname,就我們具體例子而言就是BeginGetTime,調(diào)用這個(gè)方法以后,程序會(huì)立刻返回,然后可以做其他想做的事情,等你需要看結(jié)果的時(shí)候,你需要調(diào)用方法Endmethodname,然后得到結(jié)果。當(dāng)然如果在結(jié)果沒(méi)有返回前你調(diào)用方法Endmethodname的話,程序就會(huì)阻塞直到從服務(wù)器中得到結(jié)果。為了防止整個(gè)界面處于阻塞狀態(tài),實(shí)際實(shí)現(xiàn)的時(shí)候,你可以在一個(gè)工作者線程中調(diào)用Endmethodname方法。

五、結(jié)論

實(shí)際上,幾乎所有的編程人員都希望編寫(xiě)能在Internet上進(jìn)行交互的程序,而不管他們的運(yùn)行平臺(tái)到底是什么。而通過(guò)使用HTTP和XML技術(shù),我們基本上就能夠達(dá)到這個(gè)功能??蛻舳酥灰褦?shù)據(jù)以XML的形式進(jìn)行打包,以HTTP形式進(jìn)行傳送,服務(wù)器端就能夠進(jìn)行處理,而在服務(wù)器端,它通過(guò)創(chuàng)建一個(gè)SDL文件來(lái)描述服務(wù)對(duì)象所能夠提供的方法和參數(shù),這樣客戶端就可以正確的對(duì)服務(wù)對(duì)象進(jìn)行調(diào)用。同時(shí),一個(gè)Proxy的生成器提供了一個(gè)到達(dá)Web服務(wù)的函數(shù)集,使客戶端程序編寫(xiě)的工作變的更加簡(jiǎn)單。

需要說(shuō)明的是,微軟即將推出的Visual Studio.NET這套開(kāi)發(fā)工具提供了開(kāi)發(fā)Web服務(wù)的集成環(huán)境,而這種Web服務(wù)的體系結(jié)構(gòu)同時(shí)也對(duì)Web應(yīng)用提供了安全級(jí)別,這些工具使開(kāi)發(fā)人員能夠快速有效的構(gòu)建基于Internet的應(yīng)用系統(tǒng)。

發(fā)布:2007-03-24 18:00    編輯:泛普軟件 · xiaona    [打印此頁(yè)]    [關(guān)閉]
相關(guān)文章:
上海OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢(xún):400-8352-114

加微信,免費(fèi)獲取試用系統(tǒng)

QQ在線咨詢(xún)