wcf长连接
项目有用到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长连接的更多相关文章
- WCF实现长连接
由于WCF的机制,连接池会在连接建立一定时间后超时,即使设置了超时时间非常长,也可能被服务端系统主动回收.之前做项目时碰到了这个问题,所以项目上考虑采用长连接,自动管理连接池,当连接超时后,自动重建, ...
- 保持WCF服务端与客户端的长连接
背景 客户端与服务端使用WCF建立连接后:1.可能长时间不对话(调用服务操作):2.客户端的网络不稳定. 为服务端与客户端两边都写“心跳检测”代码?不愿意. 解决 设置inactivityTimeou ...
- TCP同步与异步,长连接与短连接【转载】
原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896 这是今天看到的一篇讲到T ...
- HTTP的长连接和短连接
本文总结&分享网络编程中涉及的长连接.短连接概念. 关键字:Keep-Alive,并发连接数限制,TCP,HTTP 一.什么是长连接 HTTP1.1规定了默认保持长连接(HTT ...
- C#中HttpClient使用注意:预热与长连接
最近在测试一个第三方API,准备集成在我们的网站应用中.API的调用使用的是.NET中的HttpClient,由于这个API会在关键业务中用到,对调用API的整体响应速度有严格要求,所以对HttpCl ...
- Erlang C1500K长连接推送服务-内存
上篇 Erlang C1500K长连接推送服务-性能 提到:150w连接,使用了23GB内存,每个连接占用15KB,约一半是内核使用. 大概分析一下: 1. Erlang 节点 12GB,内部因为有内 ...
- Erlang C1500K长连接推送服务-性能
Whatsapp已经使用Erlang在生产环境跑到96GB内存单机 3M长连接,参加:WhatsApp的Erlang世界.毕竟业务级别能达到Whatsapp那样极少,现在只有千万级,单机太多挂一台影响 ...
- HTTP的长连接和短连接——Node上的测试
本文主要从实践角度介绍长.短连接在TCP层面的表现,借助Node.JS搭建后台服务,使用WinHTTP.Ajax做客户端请求测试,最后简单涉及WebSocket. 关键字:长连接.短连 ...
- 分享一个基于长连接+长轮询+原生的JS及AJAX实现的多人在线即时交流聊天室
实现网页版的在线聊天室的方法有很多,在没有来到HTML5之前,常见的有:定时轮询.长连接+长轮询.基于第三方插件(如FLASH的Socket),而如果是HTML5,则比较简单,可以直接使用WebSoc ...
随机推荐
- EXT ajax简单实例
转载:http://www.cnblogs.com/xiepeixing/archive/2012/10/24/2736751.html EXT ajax request是ext中对于ajax请求的实 ...
- .net截取指定长度汉字超出部分以指定的字符代替
下面是我在网上搜索,然后加以整理的关于在.net中截取指定长度汉字超出部分以指定的字符代替,来拓展一下自己的思路. 方法一 :在后台的select语句中直接操作或是在数据库中写一个存储过程 Selec ...
- DIV隐藏与重显
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- java常用用代码
/** *Java获取IP代码 */ import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.ev ...
- Windows下Apache部署Django过程记录
Win7/Apache/Python2.7/Django1.9部署Web 环境: Windows7 Apache httpd-2.4.16-win64-VC14 Python2.7.11 Djan ...
- a标签无disabled属性
<a class="button">确认</a> 我们经常会用a标签来设置按钮样式,如果点击它跳转页面,那么没有任何问题. 如果绑定了ajax事件,即点击后 ...
- 2-16 HDO1106
这题寒假也没搞出来,但今天花了一小时终于搞定. 题意是输入一串数字字符,把‘5’当作空格,然后把被分割开的数字进行排序输出. 首先是字符串输入,按照高精度的处理方法,数值低位放到数组低位.(字符串型的 ...
- 魅蓝3s adb interface 找不到驱动程序
完全照搬大神的步骤就ok啦,,自己记录下,方便以后查找 Win7 x64 Eclipse无法识别手机 / adb interface有黄色感叹号,无法识别 http://blog.csdn.net/z ...
- java 属性
//非静态类 不能定义静态属性/方法/静态类, 可以定义静态常量属性. public class A{ public class B{ public static String _str; //❌, ...
- Solr In Action 笔记(2) 之 评分机制(相似性计算)
Solr In Action 笔记(2) 之评分机制(相似性计算) 1 简述 我们对搜索引擎进行查询时候,很少会有人进行翻页操作.这就要求我们对索引的内容提取具有高度的匹配性,这就搜索引擎文档的相似性 ...