|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
有一些像NSCopying的接口(经@李禹龙提醒应该叫协议)不是特别用到开始不用了解NSObject创建对象的时候用+(id)alloc方法创建后需要init方法初始化择要
本文能够看做是ChrisTacke的文章AnIntroductiontoWCFforDeviceDevelopers的翻译,文中代码因为笔者调试必要稍作了修正,部分做了进一步的申明,并将部分链接更新。
Keyword
WindowsMobile,WCF,.NETCF,Services,XmlSerialization
这是一篇我保举给良多伴侣看过的文章。文章很短,也没有触及太多WCF道理性的工具,可是作为WCFMobile开辟进门,这倒是个很好的导游,为了便利浏览,有些中央我做了分外的申明。
Enjoyit~
1开辟情况与工具
1.VisualStudio2008(Orcas)RTM.
2.PowerToysfor.NETCompactFramework3.5
3.一台撑持.NETCompactFramework3.5的WindowsMobile5.0/6.0的摹拟器大概设备.
(ChrisTacke在他的设备上调试乐成,在摹拟器上因为某些不成知的要素失利了。笔者在摹拟器上调试乐成)
4.WindowsXP大概Vista的操纵体系
(ChrisTacke在XP下调试的,笔者则是在Vista下)
2PC真个WCF服务程序
固然,这只是一个很复杂的模子,就是经由过程WCF使挪动设备与PC举行信息交互。
起首,我们必要在PC机上构建一个服务,这个服务虚现的功效很复杂,就是举行两个整数的加法,并前往了局。
第一步,翻开你的VS创立一个把持台程序,并增加援用:System.ServiceModel
然后,增加一个新的类(现实上是一个接口,它用于界说我们的服务所表露出来的左券),我们把这个类定名为IMyProcess,其内容以下:
<br>usingSystem.ServiceModel;
<br>namespaceFreesc.WCF.Demo
<br>
<br>
<br>{
<br>[ServiceContract(Namespace=http://Freesc.WCF.Demo)]
<br>publicinterfaceIMyProcess
<br>
<br>
<br>{
<br>[OperationContract]
<br>intAdd(inta,intb);
<br>}
<br>}接上去,我们必要一个该托言的详细完成来作为我们的服务。为我们的工程另增加一个类,叫做MyProcessService,也就只包括一个Add办法。其代码以下:
<br>usingSystem;
<br>
<br>namespaceFreesc.WCF.Demo
<br>{
<br>publicclassMyProcessService:IMyProcess
<br>{
<br>publicintAdd(inta,intb)
<br>{
<br>Console.WriteLine(string.Format(
<br>"Received"Add({0},{1})"returning{2}",a,b,a+b));
<br>returna+b;
<br>}
<br>}
<br>}
<br>好,服务的内容已写好了,我们必要来看看这个PC真个Server是怎样事情的了。起首,请将你的Program.cs交换为以下代码:
<br>usingSystem;
<br>usingSystem.ServiceModel;
<br>usingSystem.ServiceModel.Description;
<br>usingSystem.Net;
<br>
<br>namespaceFreesc.WCF.Demo
<br>{
<br>classProgram
<br>{
<br>staticvoidMain(string[]args)
<br>{
<br>//取得服务器IP
<br>stringhostIP=Dns.GetHostEntry(Dns.GetHostName()).AddressList[2].ToString();
<br>#ifCLIENT_DISCOVERY_BUILD
<br>Uriaddress=newUri(string.Format("http://localhost:8000/calculator",hostIP));
<br>#else
<br>Uriaddress=newUri(string.Format("http://{0}:8000/calculator",hostIP));
<br>#endif
<br>ServiceHostserviceHost=newServiceHost(typeof(MyProcessService),address);
<br>try
<br>{
<br>//增加一个服务节点
<br>serviceHost.AddServiceEndpoint(
<br>typeof(IMyProcess),
<br>newBasicHttpBinding(),
<br>"Calculator");
<br>#if!CLIENT_DISCOVERY_BUILD
<br>//同意运转时的元数据交互(利用NetCfSvcUtil工具)
<br>ServiceMetadataBehaviorsmb=newServiceMetadataBehavior();
<br>smb.HttpGetEnabled=true;
<br>serviceHost.Description.Behaviors.Add(smb);
<br>#endif
<br>serviceHost.Open();
<br>Console.WriteLine("MyProcessServiceisrunningat"+address.ToString());
<br>Console.WriteLine("Press<ENTER>toterminate");
<br>Console.ReadLine();
<br>//把服务形态置为封闭
<br>serviceHost.Close();
<br>}
<br>catch(CommunicationExceptionce)
<br>{
<br>Console.WriteLine("Anexceptionoccured:{0}",ce.Message);
<br>serviceHost.Abort();
<br>}
<br>}
<br>}
<br>}
<br>
<br>这段程序要稍稍庞大一点,起首,你大概会注重到这里用了一些预编译指令。利用这些预编译指令是由于我们要在稍后的一个工具中会见这个运转的服务并为我们天生一些代码。假如你临时还对照晕的话,别急,稍后会说到这个工具的。
这里的CLIENT_DISCOVERY_BUILD只是一个前提编译的标记,您临时能够忽视之。实在这里只是为了我们编译代码的时分版本切换对照便利。
某些情形下我们但愿把后面编译的A版本的代码暂存起来,以避免在CS文件中该来改来改往,这时候只必要在Debug的设置项面前目今做一些修正,好比这里我们加上了Discover这一项,用记事本翻开工程文件,能够看到这一段:
<br><PropertyGroupCondition=""$(Configuration)|$(Platform)"=="Discovery|AnyCPU"">
<br><DebugSymbols>true</DebugSymbols>
<br><OutputPath>bin"Discovery"</OutputPath>
<br><DefineConstants>TRACE;DEBUG;CLIENT_DISCOVERY_BUILD</DefineConstants>
<br><DebugType>full</DebugType>
<br><PlatformTarget>AnyCPU</PlatformTarget>
<br><ErrorReport>prompt</ErrorReport>
<br></PropertyGroup>好,那这一段主程序代码究竟有甚么感化呢?起首,我们必要为我们的服务创立一个Uri。
要创立这个Uri起首要晓得本机的IP。这里假如你间接CopyChrisTacke的代码大概不克不及运转(出格是Vista用户),大概会抛出一个如许的非常:
<br>
这个时分你必要反省你的IPAddress的AddressFamily,大概间接CMD下观察ipconfig,假如是IPV6的话(如我呆板上的AddressList[0]就是iPV6的格局),则会抛除上述非常,iPv4则统统OK。
接上去,我们创立了一个服务主机(ServiceHost)和一个服务节点(endpoint),请注重,这里我们用的协定绑定体例是BasicHttpBinding,在精简版的WCFframework中默许只要两种绑定绑定体例(另外一种是WindowsMobileMailBinding,我在从此的文章中会先容)。然后我们给服务起了个名字叫做“Calculator”。
接上去,能够看到我们先条件到过的前提编译标记,在我们开启Discovery的设置情况下,我们的工具(下文会提到)能够与该程序集的元数据举行交互用来天生一些代码,不外下面的代码里是处于关失落的形式。
好了,如今能够来试着编译这段代码了,编译的时分请确保在Discover的形式下。
<br>
假如统统OK,你将会看到以下的画面:
<br>
注重:假如是Vista用户,假如开启了UAC,你大概必要以办理员的身份运转编译好的可实行程序,不然大概会有某些权限成绩。
然后,我们在扫瞄器中键进这里显现的地点,能够看到以下画面
<br>
假如你切实其实看到上述页面,很好,我们的事情已完成一半了。
3.NetCFSvcUtil.exe
上面我们必要借助一个小工具---netcfSvcUtil来匡助我们天生一些代码,这个办法合用于那些初度举行WCFforMobile编程的人,大概是象我如许对照懒,对照喜好利用小工具的程序员。
翻开你的命令行工具,你的PowerToy默许安装在相似如许的目次下:
C:"ProgramFiles"Microsoft.NET"SDK"CompactFramework"v3.5"bin.
在之前的服务运转的时分,在该目次下运转以下的命令:
netcfSvcUtil.exe/language:cshttp://localhost:8000/calculator
你能够看到如图的输入:
<br>
此时你会发明在该目次下天生了两个CS文件,这里分离是MyProcessService.cs和CFClientBase.cs
在接上去的步骤中,我们会用到这两个文件。
4.CF真个使用程序
接上去,我们新建一个SmartDevice的窗体使用程序,工程定名为DeviceClient。将后面天生的那两个文件Copy到该工程中来,然后,我们得增加以下一些援用(次要是那两个由工具天生的cs文件必要):
-System.ServiceModel
-System.Runtime.Serialization
这里的代码以下:
<br>publicForm1()
<br>{
<br>InitializeComponent();
<br>try
<br>{
<br>//在TextBox中显现本机IP
<br>tbMyIP.Text=Dns.GetHostEntry(
<br>Dns.GetHostName()).AddressList[0].ToString();
<br>}
<br>catch(Exceptionex)
<br>{
<br>MessageBox.Show("NoNICfound?");
<br>}
<br>}
<br>privatevoidmenuCalculate_Click(objectsender,EventArgse)
<br>{
<br>inta=0;
<br>intb=0;
<br>try
<br>{
<br>//承受文本框的输出,并存进整形变量a,b中
<br>a=int.Parse(tbFirst.Text);
<br>b=int.Parse(tbSecond.Text);
<br>}
<br>catch
<br>{
<br>//假如转换失利(好比填进了有效的数字)则间接前往
<br>return;
<br>}
<br>SMC.Bindingbinding=MyProcessClient.CreateDefaultBinding();
<br>stringremoteAddress=MyProcessClient.EndpointAddress.Uri.ToString();
<br>remoteAddress=remoteAddress.Replace("localhost",“192.168.1.101”);
<br>EndpointAddressendpoint=newEndpointAddress(remoteAddress);
<br>MyProcessClientclient=newMyProcessClient(binding,endpoint);
<br>try
<br>{
<br>lbResult.Text=client.Add(a,b).ToString();
<br>}
<br>catch(Exceptionex)
<br>{
<br>MessageBox.Show(ex.Message);
<br>}
<br>}
<br>代码很短,不外很主要的一点是我们没有利用DeviceClient的默许机关器,我们把RemoteAddress中的”localhost”交换成了服务地点主机的IP(你能够在MyProcessClient类的找到响应的静态字段)。
点击menuCalculate我们看到以下的了局:
PC机上
<br>
设备上
<br>
下载完全代码
总结
从下面的例子我们看到,在WindowsMobile上构建一个WCF的使用程序并非太难,代码量也不年夜,只是我们短少响应的文档资本,大概本文能帮你勤俭一点上手的工夫。
但愿这篇漫笔能对人人有所匡助,只管它并没有对某些细节做分明的论述,可是信任您已可以依照文中的做法,在WindowsMobile上轻松构建出你本人的WCF程序,那末本文的目标也就到达了。
Regards
|
|