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文字了。有什么问题或者可以改的比较好用的地方请留言!

 

 

posted @ 2012-08-13 21:08  koi  阅读(3015)  评论(2编辑  收藏  举报