熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

.NET Framework中使用XML Web Service

2013-11-13 10:24:08  來源: .NET編程 

  Microsoft?NET Framework 精簡版的一個主要功能是能夠使用 XML Web ServiceMicrosoft NET Framework 精簡版支持以兩種不同的方式使用 XML Web Service:同步和異步這兩種方式各有優缺點同步 XML Web Service 調用編碼簡單而異步調用的編碼略微復雜如果 XML Web Service 長時間無響應同步調用將凍結應用程序而異步調用則允許用戶在調用 XML Web Service 期間與應用程序進行交互

  通過 Smart Device(智能設備)項目使用 XML Web Service 時將發生幾秒鐘的初始延遲如果生成異步調用則此延遲不會凍結應用程序的用戶界面NET Framework 精簡版運行時設置 XML Web Service 的連接細節並緩存連接細節時將發生此延遲通常情況下這會導致應用程序無響應以後再調用 XML Web Service 時性能將會顯著提高

  本文說明了如何向 Smart Device(智能設備)項目添加對 XML Web Service 的 Web 引用以及如何同步和異步調用 XML Web Service

  本文假設您在使用 Microsoft Visual Studio? NET 創建智能設備應用程序方面有一定的經驗

  使用 Web 服務

  要在 Smart Device(智能設備)項目中使用 XML Web Service您需要在項目中添加 Web 引用項目通過 Web 引用來使用 XML Web Service在項目中添加 Web 引用時Visual Studio NET 將自動生成一個代理類(其中包含用作 XML Web Service 每個公開方法的代理的方法)默認情況下代理類不會顯示在 Solution Explorer(解決方案資源管理器)中應用程序使用自動生成的類(而不是使用自己的代碼修改的類)來訪問 XML Web Service

  要向項目中添加 Web 引用請執行以下操作

  在 Solution Explorer(解決方案資源管理器)中選擇要使用 XML Web Service 的項目 在 Project(項目)菜單上選擇 Add Web Reference(添加 Web 引用) 輸入要使用的 XML Web Service 的 URL並單擊 Go(轉到)按鈕

  Add Web Reference(添加 Web 引用)對話框

  在 Web reference name(Web 引用名稱)字段中輸入將在代碼中用於以編程方式訪問選定 XML Web Service 的名稱 單擊 Add Reference(添加引用)按鈕以在應用程序中創建對 XML Web Service 的引用新引用將顯示在 Solution Explorer(解決方案資源管理器)中選定項目的 Web References(Web 引用)節點下

  Visual Studio NET 在添加 Web 引用時生成的代理類還包含用於同步或異步訪問 Web 服務的方法現在我們來看一下如何實現此目的

  生成同步 XML Web Service 調用

  生成對 XML Web Service 的同步調用時調用線程將中斷直到 XML Web Service 返回方法調用的結果如果在服務器中調用的方法不需要太多的處理時間且將迅速返回則同步調用比較有用此外同步 XML Web Service 調用比異步調用容易實現但是通過 NET Framework 精簡版應用程序調用 XML Web Service 時將發生重大延遲這將使應用程序鎖定並使用戶接口凍結直到返回方法調用為止

  要生成同步 XML Web Service 調用需要創建一個代理類實例然後調用此代理類中的方法方式與調用其他類中的方法相同以下代碼示例演示了如何生成對 XML Web Service 的 Web 方法(用於返回有關 SQL Server 附帶的 Pubs 示例數據庫中的書籍的信息)的調用然後代碼將通過 DataSet 將數據加載到 Windows 窗體上的 ListView 控件

  此示例假設您在添加 Web 引用(如本文第一部分所述)時將 Web 引用命名為 BookCatalogBookCatalog XML Web Service 包含 GetItems Web 方法該方法將返回一個 DataSet 對象此代碼取自本文附帶的下載中的 button_Click() 事件處理程序

  // 調用 XML Web Service // 創建 Web 服務代理類的實例BookCatalogService bookcatalog = new BookCatalogService()

  // 創建 DataSet 對象的新實例並調用 Web 服務// 方法 GetItems 檢索書籍列表DataSet ds = bookcatalogGetItems()

  // // 處理 DataSet // 遍歷 DataSet 並將每個行的 Title_ID 和 Title 字段

  // 添加至 ListViewforeach(DataRow drBook in dsTables[]Rows) {

  // 創建一個新 ListViewItem 添加到 ListView ListViewItem book = new ListViewItem()

  // 將 Title_ID 字段指定給 Text 屬性 bookText = drBook[Title_ID]ToString()

  // 將 Title 字段指定給第一個 SubItem bookSubItem[]Text = drBook[Title]ToString() // 將書 ListViewItem 添加到 ListView listViewItemsAdd(book)

  }//

  生成異步 Web 服務調用

  通過生成異步 XML Web Service 調用您可以在等待 XML Web Service 作出響應時繼續使用調用線程也就是說用戶可以在應用程序未鎖定的情況下繼續與其交互而 XML Web Service 訪問也將繼續進行這是一種更好的設計模式通過使用多線程支持可以更有效地在智能設備應用程序中使用線程生成異步調用時將在不同於運行用戶界面的線程中生成調用XML Web Service 應用程序不需要任何特殊配置即可支持異步訪問也不需要知道調用方式是同步還是異步代理類中的每個同步方法都有相應的 Begin 和 End 方法例如如果 XML Web Service 方法名為 GetItems則異步方法為 BeginGetItems 和 EndGetItems

  異步調用 XML Web Service 分兩個步驟第一步調用 Begin 方法以初始化 Web 方法調用第二步調用 End 方法以完成 XML Web Service 調用並檢索 XML Web Service 的響應

  Begin 方法返回一個 SystemWebServicesProtocolWebClientAsyncResult 對象用於實現 SystemIAsyncResult 接口此對象提供關於待定異步調用的狀態信息通過將此對象傳遞給 End 方法代理類可以標識要完成的請求尤其是同時生成多個異步調用時

  有多種方法可以確定異步 XML Web Service 調用何時完成

  向 Begin 方法傳遞一個回調委托回調委托將在 XML Web Service 調用完成後執行 使用 IAsyncResultAsyncWaitHandle 對象的 WaitHandle 方法之一強制應用程序等待使用 WaitHandle 類的方法時客戶端也可以指定超時超時過後客戶端將不再等待調用的 XML Web Service 的結果 在主線程代碼中輪詢 IAsyncResultIsCompleted 屬性的值以查找值 true如果此屬性為 true則調用 End 方法以檢索 XML Web Service 的響應 可直接調用 End 方法而無需使用其他技術確定異步 XML Web Service 調用是否完成此方法將中斷調用線程的執行直到異步調用完成為止

  最有效的方法是向 Begin 方法傳遞一個回調委托因為回調函數在等待響應期間不會中斷線程XML Web Service 返回其響應時回調委托將在新線程中執行然後在回調中調用 End 方法

  以下代碼演示了如何創建異步 XML Web Service 調用此代碼顯示了對 BeginGetItems 的調用語法如下

  BeginGetItems(SystemAsyncCallback callback object asyncState)

  BeginGetItems 使用兩個參數第一個是 AsyncCallback 對象它是通過在構造函數內傳遞 ServiceCallback 方法的地址創建的第二個參數是對象類型的參數可以傳遞任何可幫助您處理 XML Web Service 響應的對象可以通過獲取回調方法中 IAsyncResult 參數的 AsyncState 屬性來訪問此同一對象在以下示例中以這種方式傳遞的對象是 XML Web Service 代理對象因此在執行回調委托時可以調用 EndGetItems如下面的 ServiceCallback 方法所示

  private void button_Click(object sender SystemEventArgs e){

  // 禁用 Async 按鈕並清除任何數據的 ListView

  // 創建 XML Web Service 代理類的實例 BookCatalogService ws = new BookCatalogService()

  // 創建對回調委托的引用 AsyncCallback cb = new AsyncCallback(ServiceCallback)

  // 調用 Begin 方法將回調委托和

  // 此代理類實例作為 AsyncState 對象傳遞 wsBeginGetItems(cbws)}private void ServiceCallback(IAsyncResult ar){

  // 將 AsyncState 對象轉換為代理對象 BookCatalogService ws = (BookCatalogService)arAsyncState;

  // 調用 End 方法並將響應指定給 DataSet DataSet ds = wsEndGetItems(ar)

  // 遍歷 DataSet 並將每個行的 Title_ID 和 Title 字段

  // 添加至 ListView foreach(DataRow drBook in dsTables[]Rows) {

  // 創建一個新 ListViewItem 添加到 ListView ListViewItem book = new ListViewItem()

  // 將 Title_ID 字段指定給 Text 屬性 bookText = drBook[Title_ID]ToString()

  // 將 Title 字段指定給第一個 SubItem bookSubItem[]Text = drBook[Title]ToString()

  // 將書 ListViewItem 添加到 ListView listViewItemsAdd(book)

  }}

  盡管生成異步 XML Web Service 調用比生成同步調用所需的代碼稍多但最終結果可以生成響應更快的應用程序因此還是值得的

  重要信息異步調用 XML Web Service 時請使用多線程編程技術

  生成異步 XML Web Service 調用時如果不使用多線程技術則在兩個或多個線程同時嘗試訪問同一數據時將會出現問題技術之一(如以下代碼所示)就是在 C# 中使用 lock 語句來獲取對對象的相互獨占的訪問權以拒絕其他線程的訪問

  private void ServiceCallback(IAsyncResult ar){ // 將 AsyncState 對象轉換為代理對象 BookCatalogService ws = (BookCatalogService)arAsyncState; // 調用 End 方法並將響應指定給 DataSet DataSet ds = wsEndGetItems(ar) // 使用 lock 語句防止其他線程訪問 // listview直到完成對它的更新 lock(thislistView) { // 遍歷 DataSet 並將每個行的 Title_ID 以及 // Title 字段添加至 ListView foreach(DataRow drBook in dsTables[]Rows) { // 創建一個新 ListViewItem 添加到 ListView ListViewItem book = new ListViewItem() // 將 Title_ID 字段指定給 Text 屬性 bookText = drBook[Title_ID]ToString() // 將 Title 字段指定給第一個 SubItem bookSubItem[]Text = drBook[Title]ToString() // 將書 ListViewItem 添加到 ListView listViewItemsAdd(book) } }}

  您還應該學習其他技術例如使用 Monitor 類和 ControlInvoke 來生成線程安全的應用程序有關多線程編程技術的詳細信息可在 MSDN? Library 中找到


From:http://tw.wingwit.com/Article/program/net/201311/13504.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.