1. 程式人生 > >WCF for _NET CF快速入門

WCF for _NET CF快速入門

這是一篇我推薦給很多朋友看過的文章。文章很短,也沒有涉及太多WCF原理性的東西,但是作為WCF Mobile開發入門,這卻是個很好的嚮導,為了方便閱讀,有些地方我做了額外的說明。
Enjoy it~

1 開發環境與工具

1. Visual Studio 2008 (Orcas) RTM.
2. Power Toys for .NET Compact Framework 3.5
3. 一臺 支援.NET Compact Framework3.5Windows Mobile 5.0/6.0 的模擬器或者裝置.
(Chris Tacke在他的裝置上除錯成功,在模擬器上由於某些不可知的因素失敗了。筆者在模擬器上除錯成功

)
4. Windows XP 或者 Vista的作業系統
(Chris TackeXP下除錯的,筆者則是在Vista)

2 PC
端的WCF服務程式

當然,這只是一個很簡單的模型,就是通過WCF使移動裝置與PC進行資訊互動。
首先,我們需要在PC機上構建一個服務,這個服務實現的功能很簡單,就是進行兩個整數的加法,並返回結果。
第一步,開啟你的VS建立一個控制檯程式,並新增引用:System.ServiceModel
然後,新增一個新的類(事實上是一個介面,它用於定義我們的服務所暴露出來的契約),我們把這個類命名為IMyProcess,其內容如下:

using System.ServiceModel;
namespace Freesc.WCF.Demo
{
        [ServiceContract(Namespace 
= http://Freesc.WCF.Demo)]
publicinterface IMyProcess
        
{
            [OperationContract]
            
int Add(int a, int b);
        }

}

接下來,我們需要一個該藉口的具體實現來作為我們的服務。為我們的工程另新增一個類,叫做MyProcessService,也就只包含一個Add方法。其程式碼如下:

using System;

namespace
 Freesc.WCF.Demo
{
 
publicclass MyProcessService:IMyProcess
    
{
      
publicint Add(int a, int b)
      
{
          Console.WriteLine(
string.Format(
          
"Received 'Add({0}, {1})' returning {2}", a, b, a + b));
          
return a + b;
      }

    }

}

好,服務的內容已經寫好了,我們需要來看看這個PC端的Server是怎麼工作的了。首先,請將你的Program.cs替換為如下程式碼:

using System;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Net;

namespace Freesc.WCF.Demo
{
    
class Program
    
{
        
staticvoid Main(string[] args)
        
{
          
//獲得伺服器IP
string hostIP = Dns.GetHostEntry(Dns.GetHostName()).AddressList[2].ToString();
#if CLIENT_DISCOVERY_BUILD
          Uri address 
=new Uri(string.Format("http://localhost:8000/calculator", hostIP));
#else
          Uri address 
=new Uri(string.Format("http://{0}:8000/calculator", hostIP));
#endif
            ServiceHost serviceHost 
=new ServiceHost(typeof(MyProcessService), address);
            
try
            
{
                
// 新增一個服務節點
                serviceHost.AddServiceEndpoint(
                    
typeof(IMyProcess),
                    
new BasicHttpBinding(),
                    
"Calculator");
#if !CLIENT_DISCOVERY_BUILD
                
// 允許執行時的元資料互動(使用NetCfSvcUtil工具)
                ServiceMetadataBehavior smb =new ServiceMetadataBehavior();
                smb.HttpGetEnabled 
=true;
                serviceHost.Description.Behaviors.Add(smb);
#endif
                serviceHost.Open();
                Console.WriteLine(
"MyProcessService is running at "+ address.ToString());
                Console.WriteLine(
"Press  to terminate");
                Console.ReadLine();
                
// 把服務狀態置為關閉
                serviceHost.Close();
            }

            
catch (CommunicationException ce)
            
{
                Console.WriteLine(
"An exception occured: {0}", ce.Message);
                serviceHost.Abort();
            }

        }

    }

}


這段程式要稍稍複雜一點,首先,你也許會注意到這裡用了一些預編譯指令。使用這些預編譯指令是因為我們要在稍後的一個工具中訪問這個執行的服務併為我們生成一些程式碼。如果你暫時還比較暈的話,別急,稍後會說到這個工具的。

這裡的CLIENT_DISCOVERY_BUILD只是一個條件編譯的符號,您暫且可以無視之。其實這裡只是為了我們編譯程式碼的時候版本切換比較方便。

某些情況下我們希望把前面編譯的A版本的程式碼暫存起來,以免在CS檔案中該來改來改去,這時只需要在Debug 的配置專案下做一些修改,比如這裡我們加上了Discover這一項,用記事本開啟工程檔案,可以看到這一段:

<</SPAN>PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Discovery|AnyCPU' ">
    
<</SPAN>DebugSymbols>true</</SPAN>DebugSymbols>
    
<</SPAN>OutputPath>bin"Discovery"</</SPAN>OutputPath>
    
<</SPAN>DefineConstants>TRACE;DEBUG;CLIENT_DISCOVERY_BUILD</</SPAN>DefineConstants>
    
<</SPAN>DebugType>full</</SPAN>DebugType>
    
<</SPAN>PlatformTarget>AnyCPU</</SPAN>PlatformTarget>
    
<</SPAN>ErrorReport>prompt</</SPAN>ErrorReport>
 
</</SPAN>PropertyGroup>

好,那這一段主程式程式碼到底有什麼作用呢?首先,我們需要為我們的服務建立一個Uri

要建立這個Uri首先要知道本機的IP。這裡如果你直接Copy Chris Tacke的程式碼也許不能執行(特別是Vista使用者),可能會丟擲一個這樣的異常:

這個時候你需要檢查你的IPAddressAddressFamily,或者直接CMD下察看ipconfig,如果是IPV6的話(如我機器上的AddressList[0]就是iPV6的格式),則會拋除上述異常,iPv4則一切OK

接下來,我們建立了一個服務主機(ServiceHost)和一個服務節點(endpoint),請注意,這裡我們用的協議繫結方式是BasicHttpBinding,在精簡版的WCF framework中預設只有兩種繫結繫結方式(另一種是WindowsMobileMailBinding,我在今後的文章中會介紹)。然後我們給服務起了個名字叫做“Calculator”。

接下來,可以看到我們先前提到過的條件編譯符號,在我們開啟Discovery的配置環境下,我們的工具(下文會提到)可以與該程式集的元資料進行互動用來生成一些程式碼,不過上面的程式碼裡是處於關掉的模式。

好了,現在可以來試著編譯這段程式碼了,編譯的時候請確保在Discover的模式下。

如果一切OK,你將會看到如下的畫面:

注意:如果是Vista使用者,如果開啟了UAC,你可能需要以管理員的身份執行編譯好的可執行程式,否則可能會有某些許可權問題。

然後,我們在瀏覽器中鍵入這裡顯示的地址,可以看到如下畫面

如果你的確看到上述頁面,很好,我們的工作已經完成一半了。

3. NetCFSvcUtil.exe

下面我們需要藉助一個小工具---netcfSvcUtil來幫助我們生成一些程式碼,這個方法適用於那些初次進行WCF for Mobile程式設計的人,或者是象我這樣比較懶,比較喜歡使用小工具的程式設計師。

開啟你的命令列工具,你的Power Toy預設安裝在類似這樣的目錄下:
C:"Program Files"Microsoft.NET"SDK"CompactFramework"v3.5"bin.

在之前的服務執行的時候,在該目錄下執行如下的命令:

netcfSvcUtil.exe /language:cs http://localhost:8000/calculator

你可以看到如圖的輸出:

此時你會發現在該目錄下生成了兩個
CS檔案,這裡分別是MyProcessService.csCFClientBase.cs
在接下來的步驟中,我們會用到這兩個檔案。

4. CF端的應用程式

接下來,我們新建一個Smart Device 的窗體應用程式,工程命名為DeviceClient。將前面生成的那兩個檔案Copy到該工程中來,然後,我們得新增如下一些引用(主要是那兩個由工具生成的cs檔案需要)

- System.ServiceModel

- System.Runtime.Serialization

這裡的程式碼如下:

public Form1()
        
{
            InitializeComponent();
            
try
            
{
//在TextBox中顯示本機IP
                tbMyIP.Text = Dns.GetHostEntry(
                Dns.GetHostName()).AddressList[
0].ToString();
            }

            
catch (Exception ex)
            
{
                MessageBox.Show(
"No NIC found?");
            }

        }

       
privatevoid menuCalculate_Click(object sender, EventArgs e)
        
{
            
int a =0;
            
int b =0;
            
try
            
{
//接受文字框的輸入,並存入整形變數a,b中
                a =int.Parse(tbFirst.Text);
                b 
=int.Parse(tbSecond.Text);
            }

            
catch
            
{
                
//如果轉換失敗(比如填入了無效的數字)則直接返回
return;
            }

            SMC.Binding binding 
= MyProcessClient.CreateDefaultBinding();
            
string remoteAddress = MyProcessClient.EndpointAddress.Uri.ToString();
            remoteAddress 
= remoteAddress.Replace("localhost", “192.168.1.101”);
            EndpointAddress endpoint 
=new EndpointAddress(remoteAddress);
            MyProcessClient client 
=new MyProcessClient(binding, endpoint);
            
try

相關推薦

WCF for _NET CF快速入門

這是一篇我推薦給很多朋友看過的文章。文章很短,也沒有涉及太多WCF原理性的東西,但是作為WCF Mobile開發入門,這卻是個很好的嚮導,為了方便閱讀,有些地方我做了額外的說明。Enjoy it~ 1 開發環境與工具 1. Visual Studio 2008 (Orcas) RTM. 2. Pow

Spread for Windows Forms快速入門(1)---開始使用Spread

前言 Spread for Windows Forms是功能最為強大的表格控制元件,擁有靈活開放的物件模型和50,000個以上的API,使得開發人員幾乎可以定製所有的元素和介面。但另一方面,因為Spread的介面非常多,也有一些開發人員反映Spread的入門不太容易。希望我們編寫的“快速入門”系列文章,能夠

Spread for Windows Forms快速入門(3)---行列操作

開發人員可以定義使用者與行和列的互動,如是否可以更改行或列的大小、是否可以移動行或列、凍結指定的行或列、在行或列中查詢資料等。 更改行或列的大小 你可以允許使用者重新調整表單中行或列的大小。 設定行的Resizable屬性以允許使用者重置行的大小,設定列的Resizable屬性以允許使用者重置列的大小。使用

Spread for Windows Forms快速入門(4)---常用的單元格型別(上)

單元格型別定義了在單元格中呈現的資訊的型別,以及這種資訊如何顯示,使用者如何與其進行互動。單元格型別可以被賦給單個的單元格,整行或者整列。 使用者可以使用兩種不同的單元格型別對錶單中的單元格進行設定: 一種是可以簡單地關聯於單元格的文字格式,另一種就是顯示控制元件或者圖形化

快速入門系列--WCF--07傳輸安全、授權與審核

最大的 緩存 ims cut 常見 曾經 strong 這一 set 這部分主要涉及企業級應用的安全問題,一般來說安全框架主要提供3個典型的安全行為:認證、授權和審核。除了典型的安全問題,對於一個以消息作為通信手段的分布式應用,還需要考慮消息保護(Message Prote

快速入門系列--WCF--02消息、會話與服務寄宿

abc align bsp 不同的 cpu .org 程序 伸縮 網絡 經過WCF基礎的ABC學習,已經可以構建簡單的WCF的服務,使用不同的服務地址和綁定類型,根據業務提供所需的服務契約。但不禁想問,服務所使用的消息報文是什麽樣的形式麽?蘊含什麽樣內容呢?WCF服務是否支

git for windows快速入門教程

1.下載 2.安裝   開啟exe格式的安裝包後,除了修改安裝目錄意外,其他選項全部預設即可,一路next後等待安裝即可。 3.初始配置 a.申請一個github賬號   因為git和github是穿一條褲子的,所以有必要先申請一個github的賬號,然後記下你的使用者名稱和你申請賬號時用的郵箱(即是你的

day39-Spring 12-Spring的JDBC模板:快速入門

pri 哪些 困難 ces 5.0 使用 只需要 common commons Spring AOP的關鍵是它的底層的原理和思想,配置和使用並不是十分困難.AOP本身就是一個思想,是面向對象的延伸,不是用來替換面向對象的,而是用來解決面向對象中的一些問題的.在最初的時候提出

vuex2快速入門

for nbsp mar lin ext mac os cnblogs value san #建立store.jsimport Vue from ‘vue‘; import Vuex from ‘vuex‘; Vue.use(Vuex) export d

快速入門系列

body 現在 安全 behavior 需求 discovery 中心 驗證 溝通 最後一章將進行WCF擴展和新特性的學習,這部分內容有一定深度,有一個基本的了解即可,當需要自定義一個完整的SOA框架時,可以再進行細致的學習和實踐。 服務端架構體系的構建主要包含接下來

python 基本語法速覽,快速入門

我們 method adding ger monk use gre 數據類型 struct https://zhuanlan.zhihu.com/p/24536868 學習參考於這個博文。 我做一個筆記。 關於python一些常用的語法快速的預覽,適合已經掌握一門編程語

Django REST framework 的快速入門教程

ret turn ads 使用 blog 所有 定義 想去 cti CRM-API項目搭建 序列器(Serializers) 首先,我們來定義一些序列器。我們來創建一個新的模塊(module)叫做 crm/rest_searializer.py ,這是我們用來描述數據是如何

Celery 分布式任務隊列快速入門

ade sunday reat 失敗 繼續 complete port 機器 single Celery介紹和基本使用 在項目中如何使用celery 啟用多個workers Celery 定時任務 與django結合 通過django配置celery period

Unity快速入門

小冰 教程 應該 arp nbsp 2.3 入門 模擬操作 飛機 1.熟悉基本操作。 最權威的應該是官方出品,158元的Unity官方教程,其他的基礎操作視頻 lynda 的5.0 ,5.4都可以 2.熟悉簡單例子,將API熟悉一下啊,這個過程中,背誦API是捷徑。 2

Vue.js——60分鐘快速入門

attribute 否則 style屬性 快速 基於 oid creat get rac Vue.js是當下很火的一個JavaScript MVVM庫,它是以數據驅動和組件化的思想構建的。相比於Angular.js,Vue.js提供了更加簡潔、更易於理解的API,使得我們能

Redis快速入門

pool har 語法 ansi 使用 https 測試的 對象 sta Redis快速入門 一、簡介 Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的A

快速入門系列--WebAPI--03框架你值得擁有

let lan 最重要的 reason cnblogs err 註意 解釋 max 接下來進入的是俺在ASP.NET學習中最重要的WebAPI部分,在現在流行的互聯網場景下,WebAPI可以和HTML5、單頁應用程序SPA等技術和理念很好的結合在一起。所謂ASP.N

快速入門系列--WebAPI--01基礎

簡單例子 codec 應該 sem ons 請求重定向 選擇 char 阻止 ASP.NET MVC和WebAPI已經是.NET Web部分的主流,剛開始時兩個公用同一個管道,之後為了更加的輕量化(WebAPI是對WCF Restful的輕量化),WebAPI使用了新的管道

快速入門系列--MVC--06視圖

出版 value 快速入門 stream 類型 path .cn esc eba 到了View的呈現板塊,感覺ASP.NET MVC的學習也進入了尾聲,還是比較開心的,畢竟也有了不小收獲。這部分內容相對比較簡單,因為之前還專門學習過如何結合HTML5與MVC框架。前

快速入門系列--CLR--03泛型集合

value mov nts readonly 只有一個 並且 cer view 工作 .NET中的泛型集合 在這裏主要介紹常見的泛型集合,很多時候其並發時的線程安全性常常令我們擔憂。因而簡述下.NET並發時線程安全特性,其詳情請見MSDN。 普通集合都不支持多重並發寫操