项目有用到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. KMP算法总结

    kmp算法的T子字符串的下标的变化规律 大话数据结构这边书中的KMP算法的讲解跟最终的算法代码还是有很大的差别 java语言只会if判断语句,循环语句,但是这些语句以及可以包罗万象了,可以适用很多情况 ...

  2. (转)php中__autoload()方法详解

    转之--http://www.php100.com/html/php/lei/2013/0905/5267.html PHP在魔术函数__autoload()方法出现以前,如果你要在一个程序文件中实例 ...

  3. [转载]C++中声明与定义的区别

    C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类的实现放在cpp文件中.它们为什么能够关联到一起呢?你知道什么东西可以放在.h文件中,什么不能.什么东西又可以放在cpp文件中.如果 ...

  4. java获得系统当前日期

    package com.web.test; import java.text.ParseException; import java.text.SimpleDateFormat; import jav ...

  5. 利用Warensoft Stock Service编写高频交易软件

    利用Warensoft Stock Service编写高频交易软件 无论是哪种交易软件,对于程序员来讲,最麻烦的就是去实现各种算法.本文以SAR算法的实现过程为例,为大家说明如何使用Warensoft ...

  6. 《asp.net mvc3 高级编程》第二章 控制器

    一.控制器的角色 MVC模式中的控制器(Controller)主要负责响应用户的输入,并且在响应时通常会修改模型(Model).通过这种方式,MVC模式中的控制器主要关注的是应用程序流,输入数据的处理 ...

  7. ThinkPHP 发送post请求

    function post($url, $param=array()){ if(!is_array($param)){ throw new Exception("参数必须为array&quo ...

  8. thinkphp 文件下载实例 实现以及注意事项

            #下载        function download()        {             $id=$_GET['id'];              $file_name ...

  9. struts2.xml的配置与技巧

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-/ ...

  10. 终端编写c程序

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:JackAlan链接:http://www.zhihu.com/question/21483375/answer/322672 ...