http://support.microsoft.com/kb/308466/zh-cn
<script type="text/javascript"> function loadTOCNode(){} </script> 文章編號 |
: |
308466 |
最後修改 |
: |
2003年8月6日 |
修訂 |
: |
1.0 |
<script type="text/javascript"> var sectionFilter = "type != 'notice' && type != 'securedata' && type != 'querywords'"; var tocArrow = "/library/images/support/kbgraphics/public/en-us/downarrow.gif"; var depthLimit = 10; var depth3Limit = 10; var depth4Limit = 5; var depth5Limit = 3; var tocEntryMinimum = 1; </script> <script src="http://support.microsoft.com/common/script/gsfx/kbtoc.js??4" type="text/javascript"></script> <noscript></noscript>概要
<script type="text/javascript"> loadTOCNode(1, 'summary'); </script> 本文逐步介紹瞭如何將 Apache SOAP 2.2 客戶程序與基於 Active Server Page (ASP) .NET 的 XML Web 服務集成。本文假設 ASP .NET 服務器端的組件通過 WebMethod 屬性公開 Web 方法,並且除了爲 Web 服務本身提供名稱空間以外,不做任何事情。
要求
<script type="text/javascript"> loadTOCNode(2, 'summary'); </script> 以下各項內容描述推薦使用的硬件、軟件、網絡結構、技能和知識以及所需的 Service Pack:
• |
Java JDK 1.3 版 |
• |
Apache SOAP 2.2 版 |
本文假定您熟悉下列主題:
• |
Apache SOAP 2.2 庫設置 |
• |
Java 語言和 JavaBean 技術 |
• |
Web 服務說明語言 (WSDL) 文件 |
• |
用於 XML 的簡單 API (SAX) XML 分析模型 |
有關如何設置 Apache SOAP 2.2 庫的詳細信息,請參考這些產品的下載資料以及本文結尾處的參考 。
當使用 SOAP 接口中的複雜類型時,瞭解 JavaBean 技術會有所幫助。另外,在創建各種 Java 類時,還需要在一定程度上熟悉 Web 服務說明語言 (WSDL) 文件。
.NET XML Web 服務
<script type="text/javascript">
loadTOCNode(2, 'summary');
</script>
本文假設您的 .NET Web 服務類似於:
Microsoft Visual C# .NET:
Microsoft Visual Basic .NET:
這些聲明告訴 .NET 運行時庫不要期望任何編碼信息,並告訴它將消息解釋爲文檔或文本類型。也就是說,元素名稱有某種含義,並且由服務器負責瞭解傳入了什麼數據類型。
Apache SOAP 工具包
<script type="text/javascript"> loadTOCNode(2, 'summary'); </script> Apache SOAP 工具包用做遠程過程調用 (RPC) 機制而不是文檔交換機制。它希望將消息交換機制進行 RPC 編碼。因此,必須按照下列步驟操作以便各個部分都正常工作:
1. |
爲 .NET 終結點編寫 Java 代理。 |
2. |
創建一個類以生成 SOAP 消息的 Body 元素。 |
3. |
創建一個類以分析 SOAP 響應。 |
Java 代理
<script type="text/javascript"> loadTOCNode(2, 'summary'); </script> IBM Web 服務工具包可以生成代理;但是,由於在生成代理後您需要完成大量的工作,因而手工編寫代理通常更容易。除這一點外,還需要編寫函數,以模仿與所連接的 portType 相關聯的操作 WSDL 中的簽名。例如,echoString 函數簽名與下面類似:
這允許代理用戶實例化代理和調用函數,並只需考慮如何處理 SOAP 錯誤。代理執行下列步驟:
1. |
驗證是否已設置了 URL。 |
2. |
準備消息。 |
3. |
發送消息。 |
4. |
分析響應。 |
鑑於 Apache SOAP 2.2 類對消息進行編碼的方式,您必須覆蓋生成消息正文的代碼段以及解釋響應的代碼段。必須更改處理響應的方式,原因是對 Apache 所做的更改超出了原始 RPC 設計。調用 echoString 的完整代碼類似於下面這樣:
無論實際參數是簡單類型(如字符串)還是複雜類型(如數組),此基本窗體都會正常工作。創建 Body 類更困難。必須手工執行序列化操作。
覆蓋 Body 序列化
<script type="text/javascript">
loadTOCNode(2, 'summary');
</script>
Apache SOAP 使用一個名爲 Body 的類來序列化和反序列化 SOAP 消息。它使用 marshall 和 unmarshall 方法執行上述操作。marshall 方法是實例方法,而 unmarshall 方法是靜態類方法。鑑於 Apache SOAP 庫的結構和您使用它的方式,您無法從 Body 繼承,並且不能期望您自己的 unmarshall 版本被調用。幸好,您可以替換 marshall 並更改序列化 SOAP Body 元素的方式。
要正確地序列化 echoString 方法,請提供您自己的 Body 擴展版本。根據您所擁有的方法的數量,您可以創建一個版本的類來對每個方法擴展 Body,也可以使 marshall 方法根據其他信息選擇正確的代碼。
假設您只在派生類中序列化一個方法調用,則該類必須包括下列內容:
• |
設置所要序列化的數據的方法。 |
• |
有關如何編寫 XML 以便其對於 ASP .NET 終結點具有正確格式的知識。 |
由於 ASP .NET 終結點使用文檔/文本編碼,因此您只需要寫出下面的信息:
• |
Body 元素。 |
• |
方法名和相應的名稱空間。 |
• |
傳入方法中的參數。 |
對於 echoString 示例,該類類似於下面這樣:
既然您可以發送消息,那麼您還需要能夠讀取響應。爲此,需要一個由 SAX 分析器調用的類。
分析響應
<script type="text/javascript">
loadTOCNode(2, 'summary');
</script>
當消息發出又返回時,您可以確定整個 SOAP 響應。本部分在示例代理的 echoStringtry/catch 塊的代碼中使用。此 ClientHandler 示例類試圖成爲可以獲取任何一個元素響應的通用類。該類的用戶應該能夠原封不動地使用它。如果值爲 Boolean、日期或數值類型,可以在取得結果後進行轉換。更復雜的類型需要更復雜的實現。
要取得簡單值,必須執行下面的操作:
在上面的類中,您調用 getResult 以獲得單個元素結果。對於複雜類型和數組,請根據需要修改這段代碼。
疑難解答
<script type="text/javascript"> loadTOCNode(2, 'summary'); </script> 覆蓋 Body 序列化可能要花大量的時間並可能出錯。請測試您的代理以確保它可以處理 ASP .NET XML Web 服務爲您返回的任何內容。
參考
<script type="text/javascript">
loadTOCNode(1, 'references');
</script>
Java JDK 主頁
http://java.sun.com (http://java.sun.com)
Apache SOAP 主頁
http://xml.apache.org/soap/ (http://xml.apache.org/soap/)
編寫或使用自定義 Apache 序列化程序/反序列化程序
http://xml.apache.org/soap/docs/guide/serializer.html (http://xml.apache.org/soap/docs/guide/serializer.html)
隨時爲您服務:互操作性測試
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dn_voices_webservice/html/service08152001.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dn_voices_webservice/html/service08152001.asp)
SOAP 生成器的原始佈告(並以附件形式提供源代碼)
http://groups.yahoo.com/group/soapbuilders/message/5096 (http://groups.yahoo.com/group/soapbuilders/message/5096)
這篇文章中的信息適用於:
• |
Microsoft Visual Studio .NET 2002 專業版 |
關鍵字: |
kbhowto kbhowtomaster KB308466 |
Microsoft 和/或其各供應商對於爲任何目的而在本服務器上發佈的文件及有關圖形所含信息的適用性,不作任何聲明。 所有該等文件及有關圖形均"依樣"提供,而不帶任何性質的保證。Microsoft和/或其各供應商特此聲明,對所有與該等信息有關的保證和條件不負任何 責任,該等保證和條件包括關於適銷性、符合特定用途、所有權和非侵權的所有默示保證和條件。在任何情況下,在由於使用或運行本服務器上的信息所引起的或與 該等使用或運行有關的訴訟中,Microsoft和/或其各供應商就因喪失使用、數據或利潤所導致的任何特別的、