对于最近学习WCF的总结——唔聊的服务
作为今年的应届毕业生,找工作的压力确实很大,貌似今年的就业形势不是特别的好,如果博友们有手机客户端的职位,请帮我推荐一下,津京地区windows phone,ios,android皆可。
好了,言归正传。今天需要总结的是最近学的WCF服务编程,这个是我的毕业设计。因为刚学,如果文中有什么错误,还请多多指正。
首先介绍一下,整个应用的业务逻辑。我的毕业设计是一个多客户端平台的随机交友应用,起名叫做唔聊,有点类似于omegle.com,就是随机匹配一些陌生人进行聊天,但是不像陌陌那样主动去选择符合条件的用户,因为性别和头像总会影响我们的选择,但在omegle的基础上加入了用户信息,依然不带加好友功能。如果有富余的时间,还会加入一个按照用户常聊关键词进行匹配的功能,这其中就涉及到了自然语言处理的算法,一时半会儿搞不定。
一本《WCF服务编程》就要700多页,当一本字典不错,但是实在看不下去了。后来看了CSDN上老周的WCF系列,感觉比较适合入门在这里推荐一下。http://blog.csdn.net/column/details/wcf-example-come.html
我先说说作为一个入门者,要先从那个地方入手。我们需要了解几样比较基本的东西:终结点、契约、宿主、客户端调用,其他东西可以暂时先不管,知道这三样,就可以先写出个东西来了。
终结点(Endpoint):终结点需要了解三样东西:Address、Binding、Contract,简称ABC。
- Address是指服务的Uri地址,
- Binding是绑定方式,绑定方式基本为5种,BasicHttpBinding、NetTcpBinding、NetNamePipeBinding、WSHttpBinding、NetMsmqBinding
- Contract为契约,指向为客户端提供服务的接口
老周的终结点基本都是用编程方式写的,所以一下用config的方式来展示一下:
<endpoint address="http://169.254.80.80/WuChatServer/HostSvc.svc" binding="wsHttpBinding" bindingConfiguration="WcfMode.WSHttpBinding" name="HostSvc" contract="WuChatServer.IHost"/>
契约(Contract):WCF定义了四种契约:服务契约、数据契约、错误契约、消息契约。契约说白了,就是供客户端调用的服务,比如客户端需要调用服务端的加法方法,就定义一个接口,标为服务契约,在接口中的加法方法上标上操作契约。如果需要利用一个数据结构去通信,就用数据契约定义一个结构体,或者一个类。
如下:
[ServiceContract] public interface IService { [OperationContract] int AddMethod(int a,int b); }
public class MyService : IService
{
public int AddMethod(int a, int b)
{
return a + b;
}
}
我为唔聊定义的IHost暂时为这样的:
[ServiceContract(SessionMode = SessionMode.NotAllowed)] interface IHost { [OperationContract] bool ConnectCumm(string commId);//连接服务,加入在线列表 [OperationContract] bool DisConnectCumm(string commId);//断开服务 [OperationContract] bool ClientSend(string commId, List<byte[]> msg);//客户端发送消息 [OperationContract] List<List<byte[]>> GetHostMessage(string id);//获取服务端消息 [OperationContract] string GetStrangerId(string commId);//获取聊天对象的id [OperationContract] bool CheckConnect(string id);//检查是否在线 [OperationContract] string GetChattingNum();//获取在线人数 [OperationContract] bool GetIsChatting(string commId);//获取是否为聊天状态,或者等待状态 }
宿主(Host):因为WCF服务不能凭空存在,每个WCF服务必须托管在Windows进程中,所以我们必须为WCF服务提供一个宿主。这个宿主可以是asp.net、Winform、WPF、Silverlight等。我在唔聊中暂时用了一个WPF的窗体程序来做为宿主,你可以直接引用WCF的动态库来实现。
客户端调用(Client):客户端如何调用WCF服务是我们比较关心的,作为可以跨平台的服务框架,WCF可利用Restful来提供客户端调用的方式,通过HTTP的GET、PUT、POST 和 DELETE等方法进行操作。目前唔聊仅实现可在.net客户端(WPF、windows phone)的一部分功能,所以还是讲一下.net的调用方式。
在客户端的工程上右键引用服务
然后点击发现,可以搜索到同解决方案下的WCF服务,也可以直接输入WCF服务的地址进行引用。在高级页面中我们可以选择是否提供异步的调用方式,WPF客户端默认为只有同步调用方式,而WP8客户端为避免程序假死仅提供异步调用方式。
然后在客户端的ViewModel中编写代码:
new HostSvc.HostClient().ConnectCumm(id);//同步 var hostclient = new HostClient.HostClient();//异步 hostclient.ConnectCummCompleted += new EventHandler<HostClient.ConnectCummCompletedEventArgs>(ConnectResult); hostclient.ConnectCummAsync(id); void ConnectResult(object sender, HostClient.ConnectCummCompletedEventArgs e) { }
WP8客户端如果在调用服务中发生异常,请检查服务地址是否为localhost,如果是,按此方案解决:http://msdn.microsoft.com/zh-CN/library/windowsphone/develop/jj684580%28v=vs.105%29.aspx
android调用WCF服务可以参见:http://www.cnblogs.com/davidgu/archive/2012/05/16/2504182.html
基本上通过编写终结点、契约接口、服务宿主、客户端引用这么几步,一个WCF服务就算搭建好了。
过两天我会具体介绍客户端中的一些故事,稍微讲述一下MVVM和android的编程。
分享一张WP8客户端的设计图,P的有点水,请见谅吧。
感谢阅读倾剑飞血的博客
本文地址:http://www.cnblogs.com/jacklandrin/archive/2013/04/20/3033248.html
联系我:jacklandrin@hotmail.com
本文版权归作者所有,欢迎转载,演绎或用于商业目的,但是必须说明本文出处(包含链接)。