微軟基於Web計算的架構結構分析(轉載)

來源:互聯網
上載者:User
web|微軟 微軟基於Web計算的架構結構分析(轉載)


一、引言

  隨著Internet的發展,軟體系統已經從客戶服務器系統發展到伺服器/瀏覽器系統,但是隨著基於Internet應用的深化和基於Web計算的概念的提出,新的計算模型不再是簡單的依賴於瀏覽器作為用戶端。

  首先,我們來簡單看一下計算模型的發展曆史,一開始,由於個人電腦還尚未普及,而且電腦價格都比較昂貴,我們一般採用主機模式來進行計算,也就是說客戶實際上是通過終端和大型主機進行串連,主機分配一定的CPU時間和磁碟空間給使用者,所有使用者的計算實際上都是在主機上完成的。這樣對主機的要求非常高,要求主機上的作業系統必須是高度可靠、安全的。在這個時候,流行的是IBM的大型主機的作業系統,這裡注意的是,即使到現在,很多銀行依然通過這個模式進行運做,因為容易進行集中管理和維護,用戶端實際上僅僅是一個終端的功能,從某一個角度講就是主機螢幕的延伸。

  隨著分布式概念的提出和微機功能的增強,軟體業又提出了客戶/伺服器的計算模型,把一些非關鍵的任務(比如圖形介面的顯示,資料的顯示格式確定,資料的處理等等)放到用戶端進行執行,這樣相對就減輕了對伺服器的負擔。但是這種模式一般是基於區域網路範圍內進行的(比如在九十年代非常流行的一些基於資料庫的資訊系統就是根據這種模式構建的)。

  隨著Internet的發展和企業之間電子互動的需求的出現,出現了基於資料庫/Web伺服器/瀏覽器這樣的計算模型,這種模型實際上是基於全球網路範圍內進行的,用戶端統一的以瀏覽器的形式表現給使用者,使用者通過HTTP協議把任務提交給Web伺服器,Web伺服器通過和資料庫和應用伺服器的互動把結果通過HTTP協議傳遞給用戶端,然後用戶端再通過瀏覽器顯示結果。在這種模式下的關鍵是資料傳遞的安全性和事務性這兩個問題,因為HTTP本質是是一個無狀態的串連,所以交易處理就變得非常重要,同時因為整個業務是基於全球網路體繫結構的,所以安全性也變成一個值得關注的問題。

  隨著Internet上計算任務的複雜化和業務的多樣化,自然而然就產生了以Web為中心進行計算的需求。從本質上說,對Internet應用的複雜化使我們當前的作業系統都顯得力不從心,因為我們當前的作業系統一般都是基於單機或者區域網路系統的,而如何把作業系統擴充到整個Internet計算這個範疇內,就成了所有作業系統軟體生產廠商所必須考慮的問題。

  基於Web的軟體系統的例子有很多,比如Napster,它允許在使用者之間進行磁碟內容的共用,從某一種角度講,它的基本概念是要建立一個基於Web的檔案系統,這個檔案系統包含了所有參與者本身的檔案系統。這樣參與者之間就可以進行檔案的共用,通過輸入一定的查詢條件,我們就可以在其他的使用者的存放裝置上找到相應的檔案並進行下載(當然這種概念在區域網路中早就存在,現在Napster把這個概念擴充到了整個Internet領域而已)。
二、Web服務體繫結構分析

  這種基於Internet類型應用的出現使我們需要一個嶄新的架構結構來進行程式的設計,我們需要一個快速和方便的方法進行代碼的編寫並且能夠和Internet上其他的程式進行互動。當然在電腦之間進行資料和資訊互動這個概念並不是很新,比如通過RPC,DCOM和CORBA等都可以實現不同電腦上的進程之間的互動。但是它們都有一個致命的缺點:它們需要進行互動的機器具有相似的系統,比如MSMQ只能和MSMQ進行對話,DCOM用戶端只能和DCOM伺服器端進行互動。

  而我們真正需要的是一個通用的開發架構,也就是說不管系統的那一端是什麼東西,我們這一端都可以和它進行資訊的互動。它的本質意義就是說兩端的作業系統不僅可以是異構的(比如一端可以是Windows,另一端可以是UNIX),而且實現的語言也可以是異構的(一端可以用C++實現,另一端可以用VB實現)。

  如果大家還記得在DCOM進行互動時的資料列集(Marshal)這個概念的話,那麼就可以理解基於Internet異構系統通訊的關鍵點是什麼了。一個就是通訊的標準,兩個進程需要採用標準的協議進行通訊,另外一個就是資料的打包,資料應該採用一致的形式進行打包和解包。當前基於Internet最流行的傳輸協議就是HTTP,所有的Web瀏覽器都通過這個協議和Web伺服器進行通訊並得到相關的網頁。而資料的打包也需要採用一定的標準,當前出現的跨平台的資訊編碼的標準就是XML。因為HTTP和XML都是工業的標準,並不和任何平台,廠商掛鈎,所以基於這兩種標準構建的系統無疑在任何環境是都是有生命力的。

  為了建立一個Web服務,我們所需要做的工作就是編寫一個.Net服務物件,使它被異地進程的調用就象能夠被本地的用戶端直接調用一樣。實際上是通過給它標記一定的屬性來實現的,使它能夠被Web用戶端所使用。通過ASP.NET,這個.Net服務物件就能夠接受來自用戶端的請求(通過HTTP協議傳輸的)。也就是說.Net服務物件能夠和任何使用HTTP和XML標準的進程進行通訊,你也不需要考慮Web通訊的體繫結構,作業系統已經幫你搞定了這一切。

  從服務物件的角度來講,一個客戶和服務物件之間的通訊可以用下面的形式表示:

  1. 從用戶端的HTTP請求到達,其中參數可能包含在URL中,也可能包含在一個單獨的XML檔案中
  
  2. ASP.NET根據.asmx檔案的指定建立對象

  3. ASP.NET調用對象的某一個特定的方法

  4. 對象把結果返回給ASP.NET

  在用戶端,.NET提供了Proxy類用來快速方便的和伺服器提供的Web服務進行互動,通過開發工具得到Web服務的描述,然後就可以產生一個包含一些功能函數的Proxy類,注意,在這裡我們可以使用任何類型的語言來開發用戶端,當用戶端調用其中的某一個函數的時候,Proxy就會產生一個HTTP請求並把它發送給伺服器,當伺服器響應返回的時候,Proxy能夠對結果進行解析並返回給調用該函數的用戶端。這樣,就保證了用戶端能夠通過HTTP和XML無縫的和Web伺服器進行資訊的互動。

  從用戶端的角度來講,一個客戶和服務物件之間的通訊可以用下面的形式表示:

  1. 在運行時刻,用戶端產生一個Proxy對象

  2. 用戶端調用Proxy中的一個方法

  3. Proxy把調用轉換成HTTP和XML形式,並通過Internet發送到伺服器端

  4. Proxy通過HTTP協議得到以XML形式表現的結果,並轉化成相應的結果值返回給客戶

三、Web服務的編寫

  這裡我們可以寫一個最簡單的Web服務來說明這種新技術的使用,該Web服務以字串的形式提供當前的伺服器的時間(可以精確也可以不精確到秒)。程式是以標準的標記符"<%@...%>"開始的,在該標記符內,WebService告訴ASP.NET該頁的代碼是作為一個Web服務出現的。Language告訴ASP編譯這個頁所使用的語言是VB,然後ASP.NET就會使用Visual Basic.NET來進行代碼的編譯。CLASS屬性告訴ASP.NET當前類對象的名稱為TimeService。

  具體的代碼如下:

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

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

  為了允許開發人員使用Web服務來開發用戶端應用,需要在設計和開發的時候給他們提供一定的資訊。比如,一個Web服務的用戶端需要知道Web服務所暴露的方法和相關的參數以及所支援的協議,這個和一個標準的COM所攜帶的類型庫的概念很類似。但是類型庫是COM所專用的,而我們所提供的方法應該是和具體的體繫結構無關的,所以需要編寫一個通用的服務方法的描述。ASP.NET提供了一個可描述的服務,當編譯一個WEB服務的時候,ASP.NET提供了一個檔案清單用來說明服務所支援的協議,它所提供的方法和參數等等。這個檔案是 XML形式編碼並使用稱為SDL(Service Descriptor Language)的語言進行描述的。可以通過http://WebServer/ specifiedDirectory /TimeService.asmx?SDL這樣的形式來得到SDL語言。

  當我們用VB或者VC來編寫COM組件的時候,我們一般需要編寫一個類型庫來描述該COM組件所能提供的功能,而對ASP.NET來說,它能夠自動的產生一個SDL檔案,也可以先編寫一個SDL檔案,然後通過系統工具產生一個服務的模板檔案。

  一個典型的SDL檔案具體內容如下:

<!-- 標準的XML頭,描述版本資訊和其他相關資訊-->
<?xml version="1.0"?>
<!-- 元素serviceDescription是檔案的根節點,裡面的內容是對Web服務的描述 -->
<!-- 值TimeService表示服務的名稱 -->
<serviceDescription name="TimeService">
<!-- 元素serviceDescription包括兩個子項目,一個是協議描述,另外一個是文檔的schema描述 -->
<!-協議描述用來告訴用戶端開發人員我這個Web服務所支援的協議,並告訴他請求和響應資料的編碼格式 -->
<!-這裡我們描述了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>

<!- 這裡可以對其他的協議進行描述,比如httpget 和 soap ->
<!- schema表示對服務的抽象定義,它和採用什麼協議和它進行通訊無關 ->
<!- 它實際上包含了對服務包含的函數的名稱,參數和傳回值的表示 ->

<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服務的用戶端的編寫

   現在讓我們來看一下如何編寫用戶端的代碼。我們知道ASP.NET實際上是在偵聽三種類型的資料包,它們包括HTTP GET,HTTP POST和SOAP。

  1.採用HTTP GET的方法:

  其基本格式如下:

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

  2.採用HTTP POST的方法:

  實際上就是通過HTML的FORM格式來發送請求,其主要的代碼如下

<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的方法:

  伺服器接受通過HTTP POST請求發送的資料包,資料包以一個SOAP包的格式儲存。注意這裡的SOAP包實際上是一個XML文檔,SOAP包中包含了函數的名稱和相關的參數,當SOAP包達到伺服器的時候,APS.NET可以識別這個SOAP包,然後提取包中所包含的方法和相應的參數並建立這個對象,然後執行對該方法的調用。並把結果以XML文檔的形式返回到用戶端。這裡的關鍵是合成一個有效SOAP包,並對返回的XML文檔進行有效資訊提取。

  這裡我們可以用如下的VB代碼來實現基於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對象
 Dim parser As New DOMDocument
  ' 裝載XML文件範本
 parser.loadXML (QuoteTemplate)
  ' 設定參數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文檔的內容放到EDIT控制項txtSend中
 txtSent.Text = parser.xml
 ' 使用Microsoft Internet transfer 控制項執行HTPP POST操作
 Inet1.Execute txtURL.Text, "POST", parser.xml, "Content-Type: text/xml" + vbCr + vbLf +"SOAPAction: http://tempuri.org/GetTime"
 
End Sub

' 控制項Inetl1的訊息觸發處理

Private Sub Inet1_StateChanged(ByVal State As Integer)

 If (State = 12) Then

  ' 讀取從伺服器端返回的資料
  Dim bar As String
  bar = Inet1.GetChunk(4096)
  ' 把伺服器端返回的資料存放到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.通過智能的SOAP代理進行操作

  這種方法需要使用Visual Studio.NET開發工具,程式通過SDL檔案讀取對Web服務的描述併產生一個Proxy(注意這個Proxy可以使用一定的工具自動產生),該Proxy繼承了基類Web.Services.Protocols.SoapClientProtocol。Proxy類包含了一個屬性稱為Path,這個屬性指出伺服器的URL地址,它包含一個從SDL檔案中得到的預設的值,用戶端通過方法Invoke來啟用Proxy中的方法(比如A),該方法(A)然後建立一個SOAP包,包中包含了方法的名稱和參數,然後通過HTTP協議把它發送給伺服器。當SOAP響應包從伺服器中返回的時候,基類就對返回的值進行解析並把它返回給Proxy,再由Proxy返回給客戶。然後你可以使用具體的語言來操作這個Proxy,當前支援的語言有Visual Baisc.NET,C#和JavaScript,但不支援C++。

  下面是用VB.NET編寫的和Proxy進行互動的代碼:

Public Class Form1 Inherits System.WinForms.Form
 ' 當點擊按紐GetTimeSynch時的處理(同步處理)
 Protected Sub btnGetTimeSynch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
  ' 產生一個新的Proxy類的對象執行個體
  Dim ThisTimeServiceProxy As New TimeService()
  ' 設定由使用者指定的屬性Path的值
  ThisTimeServiceProxy.Path = TextBox2.Text
  ' 實際調用方法,並把結果返回到文字框中
  ' CheckBox1的值表示方法GetTime的參數值
  TextBox1.Text = ThisTimeServiceProxy.GetTime(CheckBox1.Checked)
 End Sub

 Dim AsyncTimeServiceProxy As TimeService
 Dim AsyncResult As IAsyncResult
 ' 當點擊按紐GetTimeASynch時的處理(非同步處理)
 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

 ' 檢查當前的操作是否結束
 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

 ' 得到採用非同步方法呼叫調用所得到的結果

 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的計算環境要比基於案頭的環境要複雜的多,而且互動時間也要長的多,比如對一個最簡單的Web服務的調用可能就要花費5到10秒甚至更長的時間,而在這個時候你不能指望使用者願意傻乎乎的一直等在那裡。換句話說,因為案頭互動時間非常短,我們可以採用同步調用的方法來調用組件的一個方法,但是在基於Internet計算的時候,我們必須採用非同步呼叫的方法。

  上面的VB.NET代碼中也示範了非同步呼叫的方法,實際上Proxy本身就包含了一個方法稱為Beginmethodname,就我們具體例子而言就是BeginGetTime,調用這個方法以後,程式會立刻返回,然後可以做其他想做的事情,等你需要看結果的時候,你需要調用方法Endmethodname,然後得到結果。當然如果在結果沒有返回前你調用方法Endmethodname的話,程式就會阻塞直到從伺服器中得到結果。為了防止整個介面處於阻塞狀態,實際實現的時候,你可以在一個工作者線程中調用Endmethodname方法。

五、結論

  實際上,幾乎所有的編程人員都希望編寫能在Internet上進行互動的程式,而不管他們的運行平台到底是什麼。而通過使用HTTP和XML技術,我們基本上就能夠達到這個功能。用戶端只要把資料以XML的形式進行打包,以HTTP形式進行傳送,伺服器端就能夠進行處理,而在伺服器端,它通過建立一個SDL檔案來描述服務物件所能夠提供的方法和參數,這樣用戶端就可以正確的對服務物件進行調用。同時,一個Proxy的產生器提供了一個到達Web服務的函數集,使用戶端程式編寫的工作變的更加簡單。

  需要說明的是,微軟即將推出的Visual Studio.NET這套開發工具提供了開發Web服務的Integration Environment,而這種Web服務的體繫結構同時也對Web應用提供了安全層級,這些工具使開發人員能夠快速有效構建基於Internet的應用系統。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。