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 ...
随机推荐
- (转) ThinkPHP模板自定义标签使用方法
这篇文章主要介绍了ThinkPHP模板自定义标签使用方法,需要的朋友可以参考下 转之--http://www.jb51.net/article/51584.htm 使用模板标签可以让网站前台开发 ...
- dbms_job dbms_scheduler简单比较
---------------------------陈旧的-------------------------------------/*--------------------- 创建job --- ...
- MySQL 查询数据
MySQL 查询数据 MySQL 数据库使用SQL SELECT语句来查询数据. 你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据. 语法 以下为在MyS ...
- WebService笔记-Schema约束
Schema约束 俗话说得好 好记性不如烂笔头. 看了下WebService视频,觉得还是得下笔记. 观看的视频地址:http://edu.51cto.com/ ...
- Hive学习之三 《Hive的表的详解和应用案例详解》
一.Hive的表 Hive的表分为内部表.外部表和分区表. 1.内部表,为托管表. 2.外部表,external. 3.分区表. 详解: 内部表,删除表的时候,数据会跟着删除. 外部表,在删除表的时候 ...
- bc命令详解与实例
bc: bc 是一种高精度的可交互执行的计算机语言.它在一些浮点数的运算中应用广泛. 一般情况下我们直接输入 bc ,便可进入其工作环境.当然,它还有其他的参数 -h 显示帮助信息并退出 -i 强制进 ...
- jQuery中事件的学习
刚学习了jQuery中的事件,主要通过bind(),toggle(),hover()来主要实现,下面先说一说关于bind的想关要点. 1.bind方法. bind方法的主要参数为bind(type,f ...
- thinkphp整合系列之支付宝RSA加密方式
thinkphp整合系列之支付宝RSA加密方式上篇博客写的是MD5加密方式:thinkphp整合系列之支付宝MD5加密方式扫码支付http://baijunyao.com/article/75 但是呢 ...
- python的bind函数
# -*- coding:utf-8 -*- class Functor(object): def __init__(self, func, index=0, *args, **kwargs): se ...
- Activity完整的生命周期
首语:群里看到一位网友说:你能说出Activity的完整生命周期吗?看到这句话,我也在反思自己,我也是个fresh,所以想找个时间仔细的扒一扒Activity生命周期. 首先拿一张简单而又复杂的生命周 ...