程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .Net Compact Framework 3.5對WCF的支持

.Net Compact Framework 3.5對WCF的支持

編輯:關於.NET

隨著微軟WCF的逐步推廣,越來越多的系統都將會采用WCF作為數據交互,如果在移動設備上還單純的保留原先的對Web Service的支持,將使得企業不得不面臨保留原先 Web Service接口,再開發基於WCF的接口,保留2套,多費事。現在都采用WCF之後,企業只需要將原先基於Web Service升級到WCF即可。省事~~。

廢話不多說了,開始介紹如何在.Net CF3.5中使用WCF吧。

開發環境:VS2008+Windows Mobile 5.0 PPC

首先創建一個空的Web Site,然後添加一個WCF Service文件,VS2008會自動創建一個IService.cs和Service.cs,修改這2個文件,來定義OperationContract及 DataContract。具體如何開發WCF,文章最後會有推薦文章。

在WCF中,將實現2個功能,一個測試功能(傳入2個int數,返回2數相加),另一個返回一個List泛型數組,存放數據。最初寫該Demo時,我返回的是DataTable類型,但 DataTable類型並不是WCF所建議使用的。稍後會有說明。

WCF寫完後,就需要對web.config進行設置。我用的是WCF Configuration工具,在web.config文件右鍵,Open With中可以添加該工具。通過該工具可以很方便的配置完 一個WCF。

啟動後效果如下:

接著開發客戶端,創建一個WM5.0的一個工程,選擇.Net CF3.5。在界面上放置一個DataGrid,將WCF傳來的數組綁定到該DataGrid中。客戶端比較簡單,關鍵在調用WCF 的地方。

在調用WCF之前,通過使用SvcUtil.exe來生成出所需要的Client端調用代碼。該程序在Program File\Microsoft.Net\SDK\Compact Framework\v3.5\bin下。

通過鍵入:netcfSvcUtil.exe /language:cs http://localhost:3721/WCFSite/Service.svc 來解析生成客戶端的調用文件。會生成2個文件,一個叫CFClientBase.cs, 另一個是你Service的cs文件。

將這2個文件添加到工程中,然後在調用WCF的地方,創建ChannelBinding、Endpoint和ServiceClient對象,然後調用WCF方法即可。

代碼如下:

1      System.ServiceModel.Channels.Binding binding = ServiceClient.CreateDefaultBinding();
2      string remoteAddress = ServiceClient.EndpointAddress.Uri.ToString();
3
4      // Server IP Address
5      remoteAddress = remoteAddress.Replace("localhost", "10.16.172.204");
6      EndpointAddress endpoint = new EndpointAddress(remoteAddress);
7      ServiceClient client = new ServiceClient(binding, endpoint);
8      try
9      {
10        //MessageBox.Show(client.Add(10, 20).ToString());
11        this.dataGrid1.DataSource = client.GetUserInfo();
12      }
13      catch (Exception ex)
14      {
15        MessageBox.Show(ex.Message);
16      }

因為我的WCF在本地,所以需要將其中remoteAddress需要替換成WCF所在的Service地址。

代碼完成後開始進行測試,點擊Get Data,返回數據,效果如下:

發現數據排列不是我想要的,這時候就需要改變DataMember中的Attribute,設置其Order順序。效果如下:

工程如下:

Tips:

1。在實際測試中,因為公司網絡設置代理服務器,所以,需要將模擬設備中的代理去除,並不允許連接到Internet,才能進行訪問WCF,否則會需要用戶驗證。

2。WCF不返回DataSet和DataTable的理由:

DataSet和DataTable類型是可序列化的,因而我們可以在服務契約中接收或返回數據表或數據集。

如果服務契約使用了DataSet和DataTable類型,生成的代理文件不會直接使用DataSet和DataTable類型,而是包含DataTable數據契約的定義(只包含DataTable的樣式, 而不包含任何代碼)。但我們可以手工修改這些定義。

注意,DataRow類型是不能序列化的。

在WCF中,還可以使用DataTable和DataSet的類型安全的子類。書中也給出了相應的例子。然而,WCF的最佳實踐則是避免使用DataTable和DataSet,以及使用DataTable 和DataSet的類型安全的子類。在《Programming WCF Services》書中闡釋了原因:

“對於WCF的客戶端與服務而言,雖然可以通過ADO.NET和Visual Studio工具使用DataSet、DataTable以及它們的類型安全的派生對象,但這種方式過於繁瑣。而且,這 些數據訪問類型都是特定的.NET類型。在序列化時,它們生成的數據契約樣式過於復雜,很難與其它平台進行交互。在服務契約中使用數據表或者數據集還存在一個缺陷, 那就是它可能暴露內部的數據結構。同時,將來對數據庫樣式的修改會影響到客戶端。雖然在應用程序內部可以傳遞數據表,但如果是跨越應用程序或公有的服務邊界發送 數據表,卻並非一個好的主意。通常情況下,更好的做法是暴露數據的操作而非數據本身。”

3。WCF可以不創建Web Site方式,可以創建Host方式來打開關閉WCF。這裡不做說明。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved