Windows Store App 開發 [解決無法存取 WCF Data Services 的問題]

在開發 Windows Store App 應用程式時 (之前稱為 Metro Style App) ,常常會需要存取遠端的資料,比如筆者先前介紹的 Web API,或是存取 WCF Data Services 服務,然而存取 Web API 比較沒什麼問題,只要使用 HttpClient 就可以了。但是如果您要存取的是 WCF 類型的服務,比如說像是:WCF Data Services 您可能在加入服務參考的時候就發生錯誤了

在開發 Windows Store App 應用程式時 (之前稱為 Metro Style App) ,常常會需要存取遠端的資料,比如筆者先前介紹的 Web API,或是存取 WCF Data Services 服務,然而存取 Web API 比較沒什麼問題,只要使用 HttpClient 就可以了。但是如果您要存取的是 WCF 類型的服務,比如說像是:WCF Data Services 您可能在加入服務參考的時候,如下:

image

如圖,在加入服務參考時就發生錯誤了,出現了個詳細資料的連結,點選詳細資料連結,會得到一個 [加入服務參考錯誤] ,如下圖:

image

根據上圖訊息的連結下載WCF Data Services Tools for Windows Store Apps 的安裝檔,如下:

image

直接點選安裝畫面如下,中文名稱為 [適用於 Windows 市集應用程式的 WCF Data Services] ,這必須獨力安裝。

image

安裝完畢後會提示必須從新開機,如下:

image

重新開機後,我們在重新開啟專案,並同樣了執行剛才的 [加入服務參考] ,此時應該就可以順利地加入參考了,並且會將剛才所安裝進來的 Assembly 參考進來,這包含了 OData & OData Client 的相關參考,從下圖中可以看的出來在 Assembly 的尾端都包含了 WindowsStore 字串,如下圖:

image

這個時候其實可以開始撰寫程式了,只不過在此之前我們還是先設計一個簡單的畫面,這個畫面只會有一個按鈕 & GridView,只是在GridView 當中筆者用了 <GridView.ItemsPanel> 來做水平的切割顯示,並套用 GroupStyle,而 Background 是筆者故意設為紅色,這時筆者的畫面長得像是這樣,如下圖:

image

如上,在 <DataTemplate> 之中,筆者只繫結了 CustomerID & CompanyName 這兩個欄位,當然,我們程式還是先抓回所有欄位。

首先,取得資料的按鈕裡面,筆者撰寫如下程式碼:

   1:              NorthwindEntities context = new NorthwindEntities(new Uri("http://localhost:52124/NorthwindWcfDataService.svc/"));
   2:              var query = (from customers in context.Customers
   3:                           select customers).Take(10);
   4:  
   5:              AsyncCallback ac = asResult =>
   6:                  {
   7:                      if (asResult.IsCompleted)
   8:                      {
   9:                          var customerResult = (query as DataServiceQuery<Customers>).EndExecute(asResult);
  10:                          GridView1.ItemsSource = customerResult.ToList();
  11:                      }
  12:                  };
  13:  
  14:              (query as DataServiceQuery<Customers>).BeginExecute(ac, context);

 

 

 

程式碼撰寫完畢後,接著當然就是執行看看是否能夠抓取到資料了,但是在點選了 [取得資料] 按鈕後,程式卻得到一個例外,如下圖:

image

訊息是:[應用程式呼叫了整理不同執行續的介面],從錯誤訊息中筆者現遺漏了一件事沒做,以前在寫 Silverlight 時,非UI執行序要存取 UI 時必須透過 DispatcherObject 來傳送處理,這在 WFP/Silverlight/Windows Store App 都是如此 (只要你不是以 JavaScript 撰寫 App),可參考:[Silverlight][小技巧]使用Dispatcher使非UI執行緒可存取UI

在 Windows Store App 中,一樣有 Dispatcher 可以使用,只是我們改叫用 RunAsync 方法,並需要多傳一個參數 "CoreDispatcherPriority" 指定視窗事件的優先順序,我們指定 Normal 即可,這時程式碼修改為如下 (紅色框起部分):

image

這時這個 Windows Store App 可以順利地執行並取得資料,如下圖:

image

如上,一個簡單範例應用,如果是存取 ASP.NET Web API 其實會更容易實作,OK 今天就到此吧。

感謝各位^^

 

範例程式下載


 

簽名:

學習是一趟奇妙的旅程

這當中,有辛苦、有心酸、也有成果。有時也會有瓶頸。要能夠繼續勇往直前就必須保有一顆最熱誠的心。

軟體開發之路(FB 社團)https://www.facebook.com/groups/361804473860062/

Gelis 程式設計訓練營(粉絲團)https://www.facebook.com/gelis.dev.learning/


 

如果文章對您有用,幫我點一下讚,或是點一下『我要推薦,這會讓我更有動力的為各位讀者撰寫下一篇文章。

非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^