用SOAP與ASP進行服務器端更新
發(fā)表時間:2023-08-18 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]客戶端和服務器通信可采用一種自定義協(xié)議。然而,SOAP為此提供了一種靈活的、易于擴展的和簡單的方案。使用XMLHTTP對象,客戶端瀏覽器可請求在服務器上執(zhí)行一個ASP,并等候服務器的響應以繼續(xù)。由于...
客戶端和服務器通信可采用一種自定義協(xié)議。然而,SOAP為此提供了一種靈活的、易于擴展的和簡單的方案。使用XMLHTTP對象,客戶端瀏覽器可請求在服務器上執(zhí)行一個ASP,并等候服務器的響應以繼續(xù)。由于原始客戶端網(wǎng)頁沒有卸載,所以對客戶來說,整個過程都是透明的,而且速度一般都非常快。
下面通過幾個示范網(wǎng)頁來探討該技術(shù)。由于只有Microsoft Internet Explorer 5和更高的版本才支持XMLHTTP,所以本章的例子要想正常工作,你的客戶端必須滿足這一最低要求。
考慮到擴展性,我不希望用一個查詢字符串來傳遞SOAP請求,因為這個字符串的長度限制在2048字節(jié)以內(nèi)。相反,我希望在HTTP標頭中傳遞請求,它不存在這方面的限制。清單A演示了如何使用客戶端JavaScript,通過HTTP標頭向服務器發(fā)送基本信息。
SOAP的問題
為了提供清單A的功能,要向服務器發(fā)出一個SOAP請求。這種請求由以下4部分組成:
信封包含整個請求,并將包含的信息標識成一個SOAP請求。
包Schema描述了構(gòu)成SOAP包的信息。
主體包含SOAP包。
包內(nèi)含有和服務器請求有關(guān)的實際信息。
由于SOAP文檔也是一個XML文檔,所以它具有和任何XML文檔一樣的限制。其中最重要的就是文檔必須“良構(gòu)”(Well-formed),這意味著兩件事情。
首先,良構(gòu)XML文檔中的標記必須封閉。為演示這一點,最簡單的辦法就是觀察HTML和XHTML的區(qū)別。在XML文檔中,所有標記都是容器標記。雖然對于<span>等容器標記來說,這不會造成問題,但對于<hr>等非容器標記,卻必須予以留意。
有兩個辦法將非容器標記變成容器標記。第一個和最明顯的辦法就是為每個標記(例如<hr>)添加一個結(jié)束標記(例如</hr>)。另一個辦法是使用自封閉的XML標記;換言之,<hr></hr>可簡寫成<hr />。還要記住,XML文檔要區(qū)分大小寫。所以,<hr></hr>是良構(gòu)的,但<HR></hr>不是。
良構(gòu)XML文檔的第二個要求是必須用單引號或雙引號來封閉屬性。所以,雖然<input type=text name=stuff />是完全有效的HTML,但卻不是良構(gòu)的XHTML,必須改成<input type='text' name='stuff' />。
SOAP文檔還具有其他大多數(shù)XML文檔都沒有一個限制,也就是必須用一個XML架構(gòu)(XML Schema)來描述SOAP文檔。架構(gòu)是文檔結(jié)構(gòu)以及用XML編寫的內(nèi)容的一種抽象表示,宗旨是為XML解析器定義和描述文檔的結(jié)構(gòu)。
創(chuàng)建SOAP文檔最簡單的方式就是連接幾個字符串。但是,這樣做容易犯錯。相反,更好的做法是使用MSXML XML文檔對象模型(DOM)的方法來創(chuàng)建SOAP文檔。以這種方式創(chuàng)建文檔,可保證文檔總是良構(gòu)的。為此,我創(chuàng)建了6個JavaScript函數(shù)來封裝MSXML的DOM對象,并創(chuàng)建一個SOAP文檔來設(shè)置、獲取、響應set或get會話變量請求,向服務器發(fā)送一個SOAP文檔,以及解析一個SOAP文檔。清單B給出了這些函數(shù);在實際的ASP頁中,則通過一個include語句來引用它們。
xmlDOM、fault和collection函數(shù)主要由其他函數(shù)調(diào)用。xmlDOM函數(shù)的作用是返回最新版本的MSXML XML DOM對象的一個實例。fault函數(shù)的作用是創(chuàng)建一個錯誤SOAP文檔,指出發(fā)生了一個錯誤。collection則是一個類構(gòu)造函數(shù),它定義了一個JavaScript關(guān)聯(lián)數(shù)組。
第4個函數(shù)是sessionSOAP,它也作為一個類構(gòu)造函數(shù)使用,使開發(fā)者不必關(guān)心具體如何創(chuàng)建一個SOAP文檔來處理會話變量。第5個函數(shù)是sessionVariable,它處理同服務器交互所需的XMLHTTP邏輯。第6個函數(shù)是sessionParser,它也是一個類構(gòu)造函數(shù),作用是解析一個會話變量SOAP文檔,獲取會話變量的鍵/值對。清單C展示了具體如何使用這些函數(shù)和類。
服務器端的情況
除了sessionSOAP和sessionVariable,客戶端的JavaScript函數(shù)和類也可在服務器端使用。之所以這樣設(shè)計,是為了避免分別編寫客戶端和服務器端函數(shù)來完成相同的任務。清單D顯示了完整的SoapTestClient.asp頁,它負責設(shè)置及獲取會話變量。
本例完整演示了如何使用XMLHTTP、MSXML和SOAP來訪問及更新服務器端信息。還可針對其他目的來使用這些技術(shù),比如更新一個ASP網(wǎng)頁而不進行常規(guī)的卸載/重載操作;由于減少了和服務器的通信,所以它有助于加快應用程序的速度。