DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> XML SOAP應用簡介 - asp.net
XML SOAP應用簡介 - asp.net
編輯:XML詳解     
OAP到底是什麼,就要自己動手建立自己的SOAP標准對象。本文可以幫助你起步。

簡介
SOAP - 簡單對象處理協議(Simple Object Access Protocol) - 是當前XML開發的熱點。它是微軟新一代Visual Studio的主要角色,是".Net"策略的基礎。如果想用VB 6編制一個有保障的SOAP服務,可以查閱微軟的SOAP工具包(VB)。但如果想了解SOAP到底是什麼,就要自己動手建立自己的SOAP標准對象。本文可以幫助你起步。

本文中,我們創建一個簡單的SOAP服務端和一個客戶端。服務端用ASP編寫,名為soap.ASP。這個文件應存放在個人Web服務器的根目錄下,如:\Inetpub\wwwroot。這個服務器將接受和處理客戶端提出的SOAP請求。客戶端是一個簡單的VB可執行文件,由Sub Main()啟動。

步驟
眾所周知,SOAP是一個“呼叫-響應”機制,按客戶/服務方式運行。客戶端(應用程序)向服務端(位於互聯網上的某個Web服務器)發出函數調用請求並傳遞參數;服務端則返回響應。呼叫與響應的內容和數據都是按XML文件格式進行傳送的。因此,要建立一個簡單的SOAP應用系統,就要建立一個客戶端和一個服務端,即一個呼叫-響應體系。

下面是一個簡單例子:
我們建立一個服務端來計算銷售交易的稅款。按照傳統的VB術語,即建立一個函數,定義如下:
Public Function GetSalesTax(ByVal pSalesTotal As Double) as Double
GetSalesTax = pSalesTotal * 0.04
End Function

一個粗糙的函數,但可作為示例(本例只能用於稅率為4%的地方)。
這個函數定義了一個函數名(GetSalesTax),一個參數(pSalesTotal – 銷售金額)和一個返回值(函數返回值)。按照面向對象原則,可以認為pSalesTotal是一個"IN"參數,GetSalesTax返回值是一個"OUT"參數。因此我們的SOAP服務端就要偵聽客戶發出的調用GetSalesTax的請求和傳遞的"IN"參數(銷售金額),然後返回帶有"OUT"參數的回應,向客戶返回所需稅款。

客戶端
下面是用VB建立一個呼叫服務的客戶端程序:
dblSalesTax = GetSalesTax(100)
得到返回值$4。

如果GetSalesTax函數是一個外部對象,比如在MTS服務器上,就要調用服務器上的DLL模塊:
Dim objTax As New CTaxCalc
dblSalesTax = objTax.GetSalesTax(100)

在SOAP系統中,遠程調用的方式略有不同,呼叫是通過XML文件傳送到服務器的。XML文件裡有調用的函數名和相應的參數:
<GetSalesTax>
<SalesTotal>100</SalesTotal>
<GetSalesTax>

為確保服務器能夠識別和解釋客戶請求,呼叫指令被包裝到一個稱之為SOAP信封的大文件裡。這個信封使用的是SOAP封裝標准的通用命名空間:
<SOAP:Envelope xmlns:SOAP="urn:schemas-XMLsoap-org:soap.v1">
<SOAP:Header></SOAP:Header>
<SOAP:Body>
<GetSalesTax>
<SalesTotal>100</SalesTotal>
<GetSalesTax>
</SOAP:Body>
</SOAP:Envelope>

最後,加入函數調用的命名空間,起到函數聲明的作用:
<SOAP:Envelope xmlns:SOAP="urn:schemas-XMLsoap-org:soap.v1">
<SOAP:Header></SOAP:Header>
<SOAP:Body>
<m:GetSalesTax XMLns:m="urn:myserver/soap:TaxCalc">
<SalesTotal>100</SalesTotal>
</m:GetSalesTax>
</SOAP:Body>
</SOAP:Envelope>

現在,已經准備好客戶請求文件,可以送往服務端了。發送請求很簡單,可以跟浏覽器表單一樣,用HTTP post方式。浏覽器可以向服務端發送復雜的表單,.Net可以向服務器發送VB代碼,但我使用XMLHTTP(IE 5以上版本才能用)。

假設strEnvelope含有XML文件格式的請求,發送格式如下:
Dim objHTTP As New MSXML.XMLHTTPRequest
Dim strEnvelope As String

@#設定發往本地服務器
objHTTP.open "post", "http://localhost/soap/soap.ASP"

@#設定標准SOAP/ XML文件頭格式
objHTTP.setRequestHeader "Content-Type", "text/XML"

@#設置呼叫函數請求
objHTTP.setRequestHeader "SOAPMethodName", _
"urn:myserver/soap:TaxCalc#GetSalesTax"

@#呼叫SOAP
objHTTP.send strEnvelope

@#取得返回值
strReturn = objHTTP.responseBody

至此,客戶端完成了向服務端發送請求的過程。現在回到服務端,看看服務端如何偵聽客戶請求並作出響應。

服務端
服務端要能夠接收客戶發出的HTTP請求,在本地服務器(http://localhost/soap.ASP)接收到客戶請求時作出回應。因此服務端要能夠解析客戶端發出的XML格式(SOAP封裝)的請求,取出調用的函數名和參數。

服務端文件是soap.ASP,它接收客戶請求的做法是:
Set objReq = Server.CreateObject("Microsoft.XMLDOM")
objReq.Load Request

然後用XSL樣式從封裝的XML文件中取出參數:
strQuery = "SOAP:Envelope/SOAP:Body/m:GetSalesTax/SalesTotal"
varSalesTotal = objReq.SelectSingleNode(strQuery).Text

根據參數計算稅款:
varSalesTax = varSalesTotal * 0.04

在將結果返回給客戶之前,要按SOAP標准做格式化封裝。過程與客戶端類似,只是把"IN"參數改換為"OUT"參數,並將函數標記名標為回應:
<SOAP:Envelope xmlns:SOAP="urn:schemas-XMLsoap-org:soap.v1">
<SOAP:Header></SOAP:Header>
<SOAP:Body>
<m:GetSalesTaxResponse XMLns:m="urn:myserver/soap:TaxCalc">
<SalesTax>4</SalesTax>
</m:GetSalesTaxResponse>
</SOAP:Body>
</SOAP:Envelope>

可以用字符串方式構造這個回應文件,也可以創建一個DOM對象,增加一個節點。
文件返回給客戶後,客戶經過解碼就能得到結果:
Dim objReturn As New MSXML.DomDocument
objReturn.LoadXML strReturn
strQuery = _
"SOAP:Envelope/SOAP:Body/m:GetSalesTaxResponse/SalesTax"
dblTax = objReturn.SelectSingleNode(strQuery).Text

這樣就完成了一個簡單的SOAP服務應用。雖然Visual Studio 7掩蓋了內在的SOAP協議,但我希望本文有助於理解SOAP的操作過程。

下面是客戶端VB代碼:
VB ClIEnt Code
Sub Main()
Dim objHTTP As New MSXML.XMLHTTPRequest
Dim strEnvelope As String
Dim strReturn As String
Dim objReturn As New MSXML.DOMDocument
Dim dblTax As Double
Dim strQuery As String

@#創建SOAP封裝
strEnvelope = _
"<soap:envelope xmlns:soap=""urn:schemas-XMLsoap-org:soap.v1"">" & _
"<soap:header></soap:header>" & _
"<soap:body>" & _
"<m:getsalestax XMLns:m=""urn:myserver/soap:TaxCalculator"">" & _
"<salestotal>100</salestotal>" & _
"</m:getsalestax>" & _
"</soap:body>" & _
"</soap:envelope>"

@#設定發往本地服務器
objHTTP.open "post", "http://localhost/soap.ASP", False

@#設定標准SOAP/ XML格式
objHTTP.setRequestHeader "Content-Type", "text/XML"

@#設置調用函數頭
objHTTP.setRequestHeader "SOAPMethodName", _
"urn:myserver/soap:TaxCalculator#GetSalesTax"

@#SOAP呼叫
objHTTP.send strEnvelope

@#取出返回信封
strReturn = objHTTP.responseText

@#加載到DOM
objReturn.loadXML strReturn

@#查詢返回值
strQuery = _
"SOAP:Envelope/SOAP:Body/m:GetSalesTaxResponse/SalesTax"
dblTax = objReturn.selectSingleNode(strQuery).Text

Debug.Print dblTax
End Sub


下面是服務端ASP代碼(文件名soap.ASP,存放在本地服務器根目錄下):
<%
Set objReq = Server.CreateObject("Microsoft.XMLDOM")

@#加載請求到XML DOM
objReq.Load Request

@#按照輸入參數查詢
strQuery = "SOAP:Envelope/SOAP:Body/m:GetSalesTax/SalesTotal"
varSalesTotal = objReq.SelectSingleNode(strQuery).Text

@#計算
varSalesTax = varSalesTotal * 0.04

@#准備返回信封
strTmp = _
"<soap:envelope xmlns:soap=""urn:schemas-XMLsoap-org:soap.v1"">" & _
"<soap:header></soap:header>" & _
"<soap:body>" & _
"<m:getsalestaxresponse XMLns:m=""urn:myserver/soap:TaxCalc"">" & _
"<salestax>" & varSalesTax & "</salestax>" & _
"</m:getsalestaxresponse>" & _
"</soap:body>" & _
"</soap:envelope>"

@#回寫結果文件
Response.Write strTmp
%>
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved