项目有用到wcf  大体是jquery + webservice + wcf(网页是客户端,wcf是服务端),现在需要服务端往客户端推送信息,本来是用客户端ajax访问 2秒一次访问服务端,后来觉得这办法不是长久之计,所以百度了下,决定使用comet。

什么是comet?点击这里!

大概就是:客户端发送个ajax请求,服务端接收到这个请求后保存这个请求,直到服务端有信息要返回给客户端或超时(超时时间自己设置,我在例子里设置30秒,不要太久,因为wcf配置也有连接的时间限制),收到信息或超时时限到了时候再重新发起一个ajax请求。

wcf的服务契约:

IService:

 1 [ServiceContract(Name="IService",Namespace="http://www.1.com",SessionMode=SessionMode.Required)]【1】
2 public interface IService
3 {
4 [OperationContract]
5 string Add();
6
7 [OperationContract(AsyncPattern = true)] 8 IAsyncResult BeginAsyn(AsyncCallback userCallback, object stateObject);
9 string EndAsyn(IAsyncResult asynResult);
10
11 [OperationContract(IsInitiating=true)]
12 string Init();
13 }

由于是网站项目,服务端需要session的功能,所以【1】SessionMode选择了SessionMode.Required。Init()是用来初始化session的,通过头部的[OperationCaontract(IsInitiating=true)]指定。“ 服务端保持客户端请求,在有需要的时候返回”这是一个异步操作,定义异步行为的是7,8,9三行的代码,这三行代码在发布后会生成一个叫做Asyn的方法供客户端调用。BeginAsyn是客户端访问生成的Asyn会首先调用的,EndAsyn是长连接返回时会调用的。即BeginAsyn和EndAsyn就代表Asyn一个方法。

Service:

 1 [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession,
2 ConcurrencyMode=ConcurrencyMode.Multiple)]【1】
3 public class Service:IService
4 {
5 public string Init()
6 {
7 return "";
8 }
9
10 public string Add()
11 {
12 if (CacheList.list.Count > 0)
13 {
14 foreach (var i in CacheList.list)
15 {
16 i.repay();
17 }
18
19 CacheList.list.Clear();
20 }
21
22 return "Add";
23 }
24
25 public IAsyncResult BeginAsyn(AsyncCallback userCallback, object stateObject)
26 {
27 MYAsynResult asyn = new MYAsynResult(userCallback, stateObject);
28 CacheList.list.Add(asyn);
29 return asyn;
30 }
31
32 public string EndAsyn(IAsyncResult ar)
33 {
34 //this._stream.EndRead(ar);
35 // this._stream.Close();
36 // return Encoding.ASCII.GetString(this._buffer);
37 return "Asyn";
38 }
39 }

上面是服务端的服务具体实现,主要注意的是【1】中的配置ConcurrencyMode=ConcurrencyMode.Multiple(并发模式的设置),如果没有这一句,你的访问就还是同步访问,达不到异步的效果。

写了一半想了想,由于很多关于wcf配置一些的信息还有具体这个配置原因我也是从别人文章上学习来的,学习的文章讲的更清楚,如果要写这些的话还不如贴出相关文章,所以就想贴出完成wcf异步学习过的文章地址应该会更好点。

有关于wcf session用法点这里  wcf服务端异步点这里 wcf并发点这里,这个就是学习步骤,看完应该就都明朗了,也会在文章最后放出完整代码。【1】需要了解wcf session 因为网站项目 需要session,当然如果自己维护一个也可以,不过我还是选择wcf提供的方式。【2】需要了解wcf异步因为长连接需要异步,wcf服务异步用到的是IAsyncResult 关于IAsynResult点这里(推荐跟楼主我一样不太了解的人看看这篇)。【3】异步后就是关于并发的东西(Service贴出的代码中【1】的配置属性一开始没写进去,导致在测试的时候一直同步的,搞的头大,后来看文章后才明白怎么回事,所以还是推荐一看wcf并发)。

最后谢谢程序猿.码农博问里的回答,还有artech的wcf讲解。

点击下载 说明一下:同时运行Hoster和WebApplication1,等WebForm1.aspx里红色背景的 Login...文字变成Add就可以点击Add文字了。有什么问题或者可以改的比较好用的地方请留言!

wcf长连接的更多相关文章

  1. WCF实现长连接

    由于WCF的机制,连接池会在连接建立一定时间后超时,即使设置了超时时间非常长,也可能被服务端系统主动回收.之前做项目时碰到了这个问题,所以项目上考虑采用长连接,自动管理连接池,当连接超时后,自动重建, ...

  2. 保持WCF服务端与客户端的长连接

    背景 客户端与服务端使用WCF建立连接后:1.可能长时间不对话(调用服务操作):2.客户端的网络不稳定. 为服务端与客户端两边都写“心跳检测”代码?不愿意. 解决 设置inactivityTimeou ...

  3. TCP同步与异步,长连接与短连接【转载】

    原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896   这是今天看到的一篇讲到T ...

  4. HTTP的长连接和短连接

        本文总结&分享网络编程中涉及的长连接.短连接概念.     关键字:Keep-Alive,并发连接数限制,TCP,HTTP 一.什么是长连接 HTTP1.1规定了默认保持长连接(HTT ...

  5. C#中HttpClient使用注意:预热与长连接

    最近在测试一个第三方API,准备集成在我们的网站应用中.API的调用使用的是.NET中的HttpClient,由于这个API会在关键业务中用到,对调用API的整体响应速度有严格要求,所以对HttpCl ...

  6. Erlang C1500K长连接推送服务-内存

    上篇 Erlang C1500K长连接推送服务-性能 提到:150w连接,使用了23GB内存,每个连接占用15KB,约一半是内核使用. 大概分析一下: 1. Erlang 节点 12GB,内部因为有内 ...

  7. Erlang C1500K长连接推送服务-性能

    Whatsapp已经使用Erlang在生产环境跑到96GB内存单机 3M长连接,参加:WhatsApp的Erlang世界.毕竟业务级别能达到Whatsapp那样极少,现在只有千万级,单机太多挂一台影响 ...

  8. HTTP的长连接和短连接——Node上的测试

        本文主要从实践角度介绍长.短连接在TCP层面的表现,借助Node.JS搭建后台服务,使用WinHTTP.Ajax做客户端请求测试,最后简单涉及WebSocket.     关键字:长连接.短连 ...

  9. 分享一个基于长连接+长轮询+原生的JS及AJAX实现的多人在线即时交流聊天室

    实现网页版的在线聊天室的方法有很多,在没有来到HTML5之前,常见的有:定时轮询.长连接+长轮询.基于第三方插件(如FLASH的Socket),而如果是HTML5,则比较简单,可以直接使用WebSoc ...

随机推荐

  1. [个人原创]关于java中对象排序的一些探讨(二)

    2.  使用Collections.sort()方法 Collections类中提供了诸多静态方法,诸如addAll(),max()等等.当自己相对Collection接口下的类处理的时候,可以看看这 ...

  2. Java学习----构造方法的重载

    一个类中有多个同名的参数不一样(参数的个数,参数的类型,参数的顺序)的构造方法 public class Student { public Student() { System.out.println ...

  3. underscorejs-sortBy学习

    2.17 sortBy 2.17.1 语法 _.sortBy(list, iteratee, [context]) 2.17.2 说明 返回一个排序后的list拷贝副本. list为集合,如数组.对象 ...

  4. Spring4.0学习笔记(9) —— Spring泛型依赖注入

    1.定义基础仓库 package com.spring.generic.di; public class BaseRepository<T> { } 2.定义基础服务层 package c ...

  5. 225 Implement Stack using Queues(用队列实现栈Medium)

    题目意思:用队列实现栈,push(),pop(),top(),empty() 思路:用两个queue,pop时将一个queue的元素pop再push到另一个队列,queue只留最后一个元素,并pop, ...

  6. Chrome不支持本地Ajax请求解决?

    今天用JQuery操作Ajax时,使用load方法加载html块 结果提示: XMLHttpRequest cannot load file~~~~~~~Origin 'null' is theref ...

  7. 工具函数之JS

    1. 判断元素是否有滚动条 /* 检测元素是否出现滚动条 @param [object HTMLElement] elm The HTMLElement object @return [Object] ...

  8. FCKEditor使用说明

    1.基本设置   先看看效果是什么样的:   效果图: 那么为什么说是FCKeditor的冰冷之心呢?这不是哗众取宠,主要是说它使用起来有点麻烦,下文就详细说明如何搞定这玩意儿. 1.FCKedito ...

  9. CodeForces 478B 第六周比赛B题

    B - B Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u   Descriptio ...

  10. 基于memcached中命令分析函数tokenize_command改造的split函数

    今天使用C重构php代码,需要手写一个split函数,于是就模仿memcached中获取用户命令的函数 static size_t tokenize_command(char *command, to ...