國內最大的酷站演示中心! 可靠的 xml web service eric schmidt microsoft corporation,xml core services 組,項目經理 2001 年 12 月 11 日
下載此專欄的示例代碼。
注意:要下載與本文相關的代碼,您需要: visual studio .net release candidate(英文) sql server 2000(英文) 在 pdc 上,我談論了有關可靠的 xml web service(web 服務)的話題,這個話題源于過去一年來的多次交流。在有關建立 xml web service 的眾多常見問題中,可靠性問題是開發人員實現分散式 web 服務所面臨的五個最重要的問題之一。如果分開來講,這個問題并不是太難,因此,本月我準備談一談建立可靠的 xml web service 這一棘手的問題。
概述 global xml web services architecture(gxa [英文])最突出的一面就是可以使用可合成處理協議擴展該體系結構。這些協議主要通過 soap 標頭實現,可以提供包括安全性、加密、路由和可靠性的廣泛服務。當您開始構建基于 gxa 的應用程序時,您將發現 gxa 實質上是一種消息處理體系結構,它通過基于標準的編碼技術 (soap) 在系統和服務之間提供協同工作能力。到目前為止,大部分實現工作都集中在 soap 1.1 和 wsdl 兼容服務上,因此 web 服務實現方案可以與多種語言和操作系統協同工作。
這是一個了不起的概念。任何兩個系統之間都能夠進行交流,只要它們能夠分析 xml 并理解 soap 規范的規則。但是,簡單的消息交換并不能滿足復雜的業務應用程序的需要。真正的應用程序(不管其內部域體系結構如何)均需要標準化的服務,例如處于 web 服務消息處理層上的安全性、授權和可靠性。在 global xml web services architecture(具體地說就是 soap、soap 模塊和基礎結構協議)的創建和實現背后有一個巨大的動力。隨著今年十月份四項新規范(ws-routing、ws-referral、ws-licensing 和 ws-security)的發布,我們已經開始著手下一代 xml web service 實現工作。盡管發布了這么多的新規范,但仍有兩個領域尚無公共規范,即事務處理和可靠的消息處理,這主要是因為這些基礎結構協議依賴于底層 soap 模塊。
本專欄主要從 gxa 環境的角度討論可靠性和可靠的消息處理的含義。而且我還要花一些時間探討通過在 .net 框架中擴展現有 web 服務類來開發可靠性協議需要做些什么。本專欄有兩個主要目的:
讓讀者了解可靠性概念,為以后各種規范的實施做好準備。請注意,本文不是規范,而只是一篇文章,旨在引發讀者思考下面要討論的問題。 說明 .net 框架中 web 服務和 soap 類強大的、基于標準的功能。 xml web service 的可靠性 我們把問題分開來講。我們前面講過,gxa 服務實現方案屬于消息處理服務,它們需要在分散式環境中發送和接收基于標準的編碼消息。在 web 服務實現方案中發送 soap 消息的主要傳輸協議是 http,它易于實現和管理,但本身不可靠。我們無需深入探討 http 不可靠的具體原因,但只要知道 http 沒有基于標準的服務來保證終點或服務器能夠接收到請求就足夠了。盡管內置的網絡層設備可以在發生一般災難性故障(例如未找到資源)時產生錯誤,但是卻沒有機制可以確保客戶端能夠以可靠的方式接收請求或響應。
建立可靠性層 明確了上述要求之后,我們來討論如何使用 .net 框架為 web 服務實現方案建立可靠性協議。根據上述要求,我建立了一個小型 api,以便提供可用的實現方案。
協議:ericrp 第一個問題是定義如何分解可靠性協議 (ericrp)。以下是該協議的關鍵之處:
該協議是用于教學的原型。 該協議主要是通過擴展 soap 消息處理層在 soap 處理層上執行的。 soap 標頭用于對處理層所需信息進行編碼。 該協議要求實現方案具有某種方式的持續存儲,以便記錄消息。本實現方案使用的是 microsoft sql server 2000。 注意:不管采取哪種方式在 soap 環境中實現可靠性層,除了 soap 分析器之外,都還需要其他基礎結構。 該協議支持對話概念,也就是說可以對多條消息進行排序,從而保證有序的發送。 該協議的全部實現方案都由 ericrp 名稱空間限定。 ericrp 基于兩方對話方案,即兩個服務可以通過 xml web services 體系結構(http、soap 和 wsdl)進行對話。 客戶端負責消息的所有更正。(本文后面有詳細論述) 服務器只負責基于特定標準發送確認。 服務器不記錄收到的過期消息。 服務器不記錄收到的無序消息。 服務器不記錄收到的重復消息。 處理 api 在這個原型中,我建立了六個主要的類和一個小型數據庫。我將類稱為處理 api。web 服務客戶端和服務器將使用這些類監控和更正使用 ericrp 可靠性協議的消息。所有的類都屬于 ericrp 名稱空間:
client.conversationmanager:由客戶端使用,創建 web 服務消息關聯和消息監控的對話環境。 client.rpclienttrace:由 web 服務客戶端使用,這些客戶端的方法對出站消息執行 ericrp 可靠性協議。 server.conversationmanager:由 web 服務服務器使用,記錄并處理入站消息。 server.rpservertrace:由 web 服務服務器使用,這些服務器的方法對入站消息執行 ericrp 可靠性協議。 reliabilityinfo:具有雙重作用。它可以由 client.conversationmanager 使用,為記錄提供可靠性信息;也可以由 web 服務客戶端代理使用,為出站消息創建必要的 soap 標頭信息。 acknowledgment:由 server.conversationmanager 使用,向客戶端發送確認。 ericrp 的工作原理 在查看代碼之前,我想先從用戶的角度說明該協議的工作原理。例如,我有一個簡單的 web 服務代理類,通過它可以向 web 服務發送訂單消息。打算使用 api 的客戶端需要執行以下操作:
首先,創建 client.conversationmanager 類的實例并開始一個新對話。例如:
private void begin() { rpclient = new ericrp.client.conversationmanager();
rpclient.messagesent += _ new ericrp.client.conversationmanager.messagesenteventhandler(process);
rpclient.conversationstarted += new _ ericrp.client.conversationmanager.conversationstartedhandler(constarted);