对于最近学习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。

  1. Address是指服务的Uri地址,
  2. Binding是绑定方式,绑定方式基本为5种,BasicHttpBinding、NetTcpBinding、NetNamePipeBinding、WSHttpBinding、NetMsmqBinding
  3. 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

本文版权归作者所有,欢迎转载,演绎或用于商业目的,但是必须说明本文出处(包含链接)。

 

 

posted @ 2013-04-20 22:36  倾剑飞血  阅读(2160)  评论(4编辑  收藏  举报