在運行時使用 UDDI (微軟)

來源:互聯網
上載者:User
微軟 在運行時使用 UDDI
Karsten Januszewski
Microsoft Corporation
2001 年 12 月

摘要:本文概述了在運行時使用 UDDI,討論了 UDDI(公用註冊表和 UDDI 服務在 Microsoft Windows .NET Server 中提供)如何用作 Web 服務的基礎結構以支援用戶端應用程式。

目錄

  • 簡介
  • UDDI 運行時基礎結構
  • 樣本方案
  • 建立 Web 服務:C# .NET .asmx
  • 使用 Web 服務:C# Windows 表單 .NET 用戶端
  • 其他方案
  • 總結
簡介
UDDI(通用說明、發現和整合)通常稱為 Web 服務的“黃頁”。雖然黃頁這一類比對於協助理解很有用,但它不能完整體現 UDDI 是如何併入基於 Web 服務的軟體體繫結構中的。黃頁類比只涉及 UDDI 的設計時用法,即通過基於關鍵字、類別或介面的搜尋來尋找和使用 Web 服務的功能。從設計時角度來看,黃頁類比十分準確:就象黃頁將企業及其電話號碼分類並編成目錄一樣,UDDI 將提供者及其 Web 服務分類並編成目錄。開發人員可以在 UDDI 中尋找 WSDL 檔案和進入點,然後將這些 Web 服務併入用戶端應用程式。
不過,UDDI 不僅僅提供設計時支援。黃頁類比並沒有提及 UDDI 如何支援運行時。發現過程結束後,UDDI 將扮演一個很重要的角色。在運行時通過編程方式查詢 UDDI 這一功能使 UDDI 可以用作構建可靠而穩固的 Web 服務應用程式的基礎結構。 UDDI 運行時基礎結構
將 Web 服務整合到用戶端應用程式中後,需要考慮可能會遇到的問題,其中一個關鍵問題是無法預測或檢測提供 Web 服務的提供者的故障,或者從故障中恢複。如果 Web 服務出現故障,用戶端應用程式可以採取什麼措施?應用程式如何適當且動態地從失敗的 Web 服務調用中恢複?
同樣,從 Web 服務提供者的角度看,Web 服務的所有者如何動態更新更改內容?我們需要考慮將 Web 服務移到新伺服器的情況。如何將此更改通過有效方式通知到 Web 服務的用戶端?所有者如何在運行時分發此資訊,而不會導致 Web 服務的所有用戶端中斷?
在上述情況下,UDDI 在提供基礎結構以支援運行時 Web 服務方面能夠扮演十分重要的角色。UDDI 通過定義調用規則來解決這些“服務品質”問題,該調用規則包括緩衝綁定資訊(如 Web 服務的進入點)以及針對此特定實現方式的其他參數。發生故障時,用戶端可以發出運行時 UDDI 查詢,用最新資訊重新整理緩衝的資訊。
上述規定的模式如下:
  1. 在 UDDI 中尋找 Web 服務。使用此 Web 服務(以 UDDI tModel 表示)的 WSDL 檔案以及進入點和其他配置資訊的實現細節,所有這些資訊都包含在 UDDI bindingTemplate 中。
  2. 為特定的 Web 服務準備一個用戶端應用程式。在用戶端應用程式中,緩衝 Web 服務的唯一 bindingKey,以便在首次使用該應用程式時,從 UDDI 檢索所需的所有資訊。
  3. 當應用程式調用遠程 Web 服務時,使用從 UDDI Web 註冊表獲得的快取資料。
  4. 如果調用失敗,則使用 bindingKey 值和對 UDDI 註冊表的 get_bindingTemplate API 呼叫以擷取新的綁定資訊。
  5. 對新舊資訊進行比較:如果不同,則重試失敗的調用。如果重試成功,則用新資料替換緩衝的資料並儲存新資料以便以後調用。不過,如果返回的綁定資訊相同,則提供者不進行任何更新,且應用程式將發生錯誤。同樣,如果有新的綁定資訊,但調用仍然失敗,應用程式也會發生錯誤。

從 Web 服務提供者的角度來說,提供者應當知道何時可以更新該 Web 服務的 UDDI 項。當 Web 服務的提供者需要將流量重新導向到新位置或者需要備份系統時,提供者只需啟用備份系統,然後在 UDDI 註冊表中更改進入點。此方法稱為失敗時重試,為用戶端提供了一種在運行時從故障中恢複的機制。 樣本方案
我們可以看一個樣本,以瞭解此模式的工作原理。此樣本方案涉及的是一家虛構公司的方案,該公司需要向其內部部門提供即時銷售資料。因此,此 Web 服務不能公開,而只在防火牆內部使用。
首先,我們需要一個 Web 服務。在這種情況下,我們將提供一個非常簡單的 Web 服務,它只支援 GetSalesTotalByRange 一種方法,這種方法使用戶端能夠擷取一定日期範圍內即時銷售資料的瞬態圖。
接下來將建立使用此 Web 服務的用戶端。我們將用戶端配置為可以緩衝進入點和 bindingKey 資訊,並為用戶端設定一種機制,以便在發生故障時從 UDDI 註冊表重新整理用戶端緩衝。 建立 Web 服務:C# .NET .asmx
Microsoft .NET 架構大大簡化了 Web 服務的編寫工作。在本例中,我們將建立一個簡單的 Web 服務,它只包含 GetSalesTotalByRange 一種方法,該方法使用兩個日期作為輸入參數,並返回兩個參數。下面是一個實現了此目的的 .asmx 頁,SalesReport.asmx:
<%@ WebService Language="c#" Class="SalesReportUSA.SalesReport" %>using System;using System.Web.Services;namespace SalesReportUSA{   [WebService(Namespace="urn:myCompany-com:SalesReport-Interface")]   public class SalesReport : System.Web.Services.WebService   {      [WebMethod]      public double GetSalesTotalByRange ( System.DateTime startDate, System.DateTime endDate )      {         return 5000.00;      }      }} 

此頁應添加到虛擬目錄中。要使用戶端樣本工作,請建立一個名為 SalesReportUSA 的虛擬目錄 (http://localhost/SalesReportUSA/SalesReport.asmx)。請注意,此 Web 服務始終返回 5000.00 作為傳回值。(要是銷售報告能夠有這樣的可預見性就好了!)真實的應用程式應當使用資料庫調用來檢索此資訊。對於本樣本,只需要一個硬式編碼值。
部署此 Web 服務的下一步是在 UDDI 註冊表中註冊該服務。此 UDDI 註冊表是一個內部 UDDI 伺服器,公開此 Web 服務沒有什麼意義。Microsoft 通過 Microsoft® Windows® .NET Server 提供本地 UDDI 服務。有關此功能的詳細資料,請參閱 Windows .NET Server(英文)Web 網站。如果沒有安裝 Microsoft .NET Server,您可以使用 Microsoft UDDI 軟體開發包 (SDK)(英文)在本機電腦上安裝 UDDI。
可以通過兩種方式在 UDDI 中註冊 Web 服務:可以使用 Web 使用者介面註冊,或者使用 UDDI SDK 通過編程方式註冊 Web 服務。SDK 使用起來非常方便,您可以參閱使用 UDDI 的 Web 服務說明和發現專欄中發布的程式碼範例。無論使用哪一種方法,都需要先將 Web 服務的 WSDL 檔案註冊為 tModel。UDDI tModel 是 XML 實體,用於表示介面和抽象的中繼資料,因此,WSDL 檔案表示為 tModel。然後,您需要將 Web 服務的進入點註冊為 bindingTemplate。UDDI bindingTemplate 是 XML 結構,用於表示有關給定 Web 服務的實現細節。有關 UDDI 架構及其與 WSDL 的關係的詳細資料,請參閱 http://www.uddi.org(英文)和 UDDI“最佳實務”文檔 Using WSDL in a UDDI Registry 1.05(英文)。
以下是使用 UDDI 服務完成上述步驟後得到的 UDDI bindingTemplate 結構的樣本。請注意,serviceKey、bindingKey 和 tModelKey 都是由 UDDI 產生的,並且對於我們儲存的實體來說是唯一的。由其他 UDDI 註冊表產生的關鍵字會有所不同。
<bindingTemplate serviceKey="ef25102d-2171-454c-ade9-3dd7a4a914ee"       bindingKey="f46fced9-2b8a-4817-b957-f8d8aca0a2f9">   <accessPoint URLType="http">      http://localhost/SalesReportUSA/SalesReport.asmx   </accessPoint>   <tModelInstanceDetails>      <tModelInstanceInfo tModelKey=            "uuid:b28fe40a-ea62-4657-88d5-752d8a6cdf77" />   </tModelInstanceDetails></bindingTemplate>

在上述結構中,我們反白了此 Web 服務的進入點和 bindingKey。這對於客戶瞭解這兩部分的資訊非常重要。此外,如果某個用戶端需要擷取此 Web 服務的 WSDL,則可以使用 tModelKey 查詢 UDDI 以擷取該 tModel。 使用 Web 服務:C# Windows 表單 .NET 用戶端
現在,我們可以轉換一下角色,看看應用程式的用戶端部分。在設計時,我們也許可以在 UDDI 中找到此 Web 服務。我們將下載相應的 WSDL 檔案並使用 Microsoft Visual Studio® .NET 的 Add Web Reference(添加 Web 參考)或 WSDL.exe 產生一個代理類。(WSDL.exe 是一個命令列工具,屬於 Microsoft .NET 架構 SDK 的一部分。)
現在可以開始編寫用戶端應用程式中的邏輯。在本例中,它是稱為 SalesReportClient.exe 的 C# Windows 表單應用程式,允許使用者查詢銷售報告資訊。
首先,需要將 UDDI .NET SDK 類添加到項目中,可以下載這些類。(Microsoft UDDI SDK 版本 1.5.2 [英文] 與 Visual Studio .NET Beta 2 相容;Microsoft UDDI .NET SDK Beta 版本 1.75 [英文] 與 Visual Studio .NET Release Candidate 相容。) using 聲明如下:
using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Configuration;using System.Windows.Forms;using System.Data;using Microsoft.Uddi;using Microsoft.Uddi.Binding;

然後,需要將 UDDI 伺服器的進入點儲存在此 Web 服務所在的位置(畢竟,UDDI 本身就是一個 Web 服務)。要執行此操作,需要為此 .exe 可執行檔建立一個應用程式設定檔,用於儲存 UDDI 伺服器的位置。Web 服務的 bindingKey 也將儲存在此設定檔中。通過在 .NET 中使用 XML 設定檔,您可以添加任意數量的 appSetting,應用程式可以通過集合擷取。
<?xml version="1.0" encoding="utf-8" ?><configuration>   <appSettings>      <add key="UDDI_URL" value="http://localhost/uddi/api/inquire.asmx" />      <add key="bindingKey" value="f46fced9-2b8a-4817-b957-f8d8aca0a2f9" /></appSettings></configuration>

在此樣本中,我們指向駐留在自己的電腦上的 Microsoft UDDI Developer Edition 伺服器。UDDI_URL 也可以是公用 UDDI 節點之一,或者是駐留在企業內部的 UDDI 註冊表。使用設定檔 app.config 的命名規則來儲存此檔案。編譯應用程式後,設定檔將被放在 /bin 目錄中,並使用它自己的 .exe 名稱命名。
剛剛完成的這個步驟(添加有關 Web 服務的配置資訊),與 Visual Studio .NET 如何在添加到項目的每個 Web 參考上公布 URL Behavior 屬性並沒有什麼不同。通過將該屬性更改為 dynamic,Visual Studio .NET 可以建立包含 Web 服務進入點的設定檔。上述操作通過提供在運行時重新查詢 UDDI 的功能,進一步擴充了此概念。因此,設定檔包含了 UDDI 節點的進入點和 Web 服務的 bindingKey。
現在,我們可以開始對應用程式本身進行編碼。首先需要建立一個文字框、一個標籤、一個按鈕和兩個日期時間選取器。然後建立一些全域變數:
   //應用程式的一些變數   private string InquiryURL = null;   private string bindingKey = null;   private string accessPoint = null;   private BindingTemplate bt;   private double salesFigure = 0;

表單被執行個體化以後,我們需要初始化以下變數:
         public Form1()   {      //      //Windows 表單設計器支援所必需      //      InitializeComponent();      //從設定檔匯入變數      InquiryURL = ConfigurationSettings.AppSettings["UDDI_URL"];      bindingKey = ConfigurationSettings.AppSettings["bindingKey"];      bool InitCache = RefreshCacheFromUDDI();      if ( InitCache == true ) accessPoint = bt.AccessPoint.Text;   }

RefreshCacheFromUDDI() 函數用於查詢 UDDI 伺服器以尋找進入點。使用 UDDI SDK 執行 UDDI API 呼叫 (GetBindingDetail),將 bindingKey 作為參數傳遞。
   private bool RefreshCacheFromUDDI()   {      //使用 UDDI SDK,設定 UDDI 進入點      Inquire.Url = InquiryURL;      //建立 get_bindingDetail UDDI API 訊息      GetBindingDetail gbd = new GetBindingDetail();      //添加 bindingKey      gbd.BindingKeys.Add( bindingKey );      try   {         BindingDetail bd = gbd.Send();         //如果成功,則使用返回集合中的第一個模板         //更新 bindingTemplate 對象         bt = bd.BindingTemplates[0];         return true;      }      catch (Exception err)      {         textBox1.Text += err.Message;         return false;      }   }

在應用程式運行期間,我們將進入點的位置放在變數中。如果使用者要重新啟動應用程式,它將在 UDDI 中重新查詢進入點,因此應用程式始終擁有對 Web 服務的最新更改。如果需要,可以將這些資料緩衝在檔案系統或資料庫中。
接下來,需要建立調用 Web 服務自身的函數:
      private bool InvokeWebService()      {         localhost.SalesReport sr = new localhost.SalesReport();         //為代理類設定進入點         sr.Url = accessPoint;         try         {            salesFigure = sr.GetSalesTotalByRange( dateTimePicker1.Value,                dateTimePicker2.Value );                        label1.Text = "選定日期的銷售圖表:$" +                salesFigure.ToString();            textBox1.Text += "Web 服務調用成功!";            return true;         }         catch (Exception err)         {            textBox1.Text += err.Message;            return false;         }      }

最後,使用者單擊按鈕時,應用程式將嘗試調用 Web 服務。
   private void button1_Click(object sender, System.EventArgs e)   {      Cursor.Current = Cursors.WaitCursor;      //嘗試調用 Web 服務      bool WebServiceSuccess = InvokeWebService();            //如果失敗,則查詢 UDDI      if ( WebServiceSuccess == false )      {         textBox1.Text += "Web 服務失敗。重新查詢 UDDI             以擷取新的進入點。\n\n";         bool UDDISuccess = RefreshCacheFromUDDI();                  //重新查詢 UDDI 成功,         if ( UDDISuccess == true )         {                        //將原進入點與新進入點進行比較            //確定是否有所變化            if ( accessPoint.Equals( bt.AccessPoint.Text ) == false)            {               //如果進入點不同,則一定是新的               //重設變數               accessPoint = bt.AccessPoint.Text;               //並嘗試再次調用 Web 服務               WebServiceSuccess = InvokeWebService();                              //無法使用新資訊調用 Web 服務                   new info                if ( WebServiceSuccess == false )               {                  textBox1.Text += "Web 服務再次失敗。UDDI 中已更新                     的進入點無效!\n\n";               }            }            else            {               textBox1.Text += "UDDI 未提供新資訊。\n\n";            }         }         else         {            textBox1.Text += "UDDI 重新整理失敗。\n\n";         }      }   }

請注意如何在運行時為 Web 服務代理類設定進入點。因為所有代理類都是從 System.Web.Services.Protocols.SoapHttpClientProtocol 中衍生出來的,所以代理類會公布一系列屬性,.Url 屬性就是其中之一。設定此屬性使我們能夠在運行時指定進入點。然後,我們可以通過線路發送 SOAP 請求。如果沒有發生異常,則表示一切正常並且從 Web 服務返回的資料顯示在表單中。但如果確實發生異常,此函數返回“假”,調用代碼將嘗試從 UDDI 重新整理進入點,以重新使用 RefreshCacheFromUDDI() 函數。
重新查詢 UDDI 之後,我們會將 UDDI 返回的進入點與原進入點進行比較。如果進入點相同,則提供者尚未使用新資訊更新 UDDI,我們所能做的只有嘗試與 Web 服務的提供者聯絡,告訴他們 Web 服務不響應。但是,如果從 UDDI 檢索到的進入點不同,則可以嘗試再次調用 Web 服務。
為類比故障,可以更改 Web 服務的名稱。嘗試運行應用程式。然後,用 Web 服務的新名稱更新 UDDI 項。再次運行應用程式。應用程式將在 UDDI 中找到新的進入點,成功查詢新服務,然後儲存此資訊。如果您完全關閉應用程式,再重新開啟,則第一次嘗試時應該能夠再次調用 Web 服務。 其他方案
這個“失敗時重試”樣本討論的是 UDDI 可在運行時用作 Web 服務用戶端的支援基礎結構。在以後的專欄中,我們將討論其他方案,包括:
  • 最佳化進入點尋找 - 可能有多個 Web 服務支援駐留在不同伺服器上的公用介面,這些伺服器又位於不同的物理位置。用戶端應使用最近的 Web 服務。通過運行時 UDDI 尋找,客戶可以根據不同服務的地理分類或與該實現關聯的其他中繼資料來確定最佳進入點。
  • 基於公用介面彙總資料 - WSDL 中可能定義了一種用於搜尋目錄的標準 Web 服務介面。該行業的很多供應商都可以實現 Web 服務介面,並在 UDDI 中發布進入點。在運行時,用戶端應用程式可以動態搜尋這些進入點並發出查詢以收集這種編錄資料。通過這種方式,輪詢應用程式可以利用運行時 UDDI 資料。

此外,我們還將討論如何最佳化 WSDL 檔案,使其真正充當介面說明檔案。 總結
UDDI 提供了重要的運行時功能,可以整合到應用程式中以建立更強壯的動態用戶端。通過將 UDDI 用作 Web 服務體繫結構中的基礎結構,可以編寫更加可靠的應用程式。

相關文章

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 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。