利用Web Services保持Http环境下的连接状态

文/hjf1223  出处/博客园

Http环境本身是一种无连接状态的架构,在这种架构下服务器只能是被动的接受客户端的请求,返回结果,而无法主动的给客户端发送数据。而在很多需要实时数据交互(比如Web IM)的场景中,我们却希望能及时得到服务器给我们返回的数据。此时,一种最为普遍的做法是:在客户端用定时器,定时去请求服务器的服务,来得到最新数据。而这样一来,很多时候却是在做无用功,频繁的请求也会无端的增加服务器和客户端在请求Web服务上的消耗。那么是否有一种更好的办法,既可以及时得到服务器的返回,同时又可以减少做无用功,以及频繁请求带来的性能问题呢?

记得前不久,在园子里有这样的一篇文章,介绍了几种WEB环境定时刷新数据的机制。其中就有提到google gmail的一种比较巧妙的做法,现在记不得当时是怎么理解这种做法了,只记得有“保持长连接”的基本做法。(当然现在也找不到这篇文章了,希望了解的朋友能提醒一下)。今天由于架构方案的需要,再来仔细思考连接保持方案,以及参考gmail的请求行为,总结了一下,应该是这样的:客户端一直保持一个与服务器的连接,这个连接一直保持着对服务器的请求动作,直到服务器发现有数据后给它返回后,才结束返回这一次请求。客户端在接收到请求返回后,在处理这些返回之前,又向服务器发送了一次连接请求,直到下一次有数据返回。不可避免的有一种情况,就是如果服务器长时间没有需要给客户端发送数据的话,那么可以就会造成请求失败(超时或其它原因)。对于这种情况的处理也是一样的,在错误的回调事件中重新发送一次请求连接。这样就可以模拟保持连接状态了。

用伪代码来描述一下思路吧:

客户端脚本:



引用:
  1: function Request()
  2: {
  3:        Ajax.Request(url,OnSuccessed,OnFailed);
  4: }
  5: function OnSuccessed(response)
  6: {
  7:        //重新发送一次请求
  8:        Request();
  9:        //处理返回数据
  10: }


Web服务:



引用:
  1: public class IMService : IHttpHandler
  2: {
  3:    public bool IsReusable{return false;}
  4:    public void ProcessRequest(HttpContext context)
  5:    {
  6:        //读取最新数据
  7:        while(true)
  8:        {
  9:            string message = GetMessage();
  10:            if(!string.IsNullOrEmpty(message))
  11:            {
  12:                context.Response.Write(message);
  13:                break;
  14:            }
  15:            Thread.Sleep(500);//等待一段时间再重新读取。
  16:        }
  17:    }
  18:    private string GetMessage()
  19:    {
  20:        //取得最新数据
  21:    }
  22: }


这种方案的好处有:客户端可以第一时间得到服务器需要给客户端发送的数据(而至于Web服务怎么知道要给客户端发送数据,也就是服务器的轮循设计,则是另一个需要考虑的方案);可以减化客户端逻辑,无需要创建和释放定时器,并减小由此产生的对客户端性能的损失;减少去服务器的请求次数,减少做无用功,节约节省带宽和减少服务器资源需要处理的连接请求。

友情提示:此文并不表示本站肯定持有相同观点,转载请注明出处。
 您可能对 [Web Service] 的这些文章也感兴趣:

Web Service 安全性解决方案(SOAP篇)  ASP.NET创建Web服务之管理Web服务状态
ASPX页Web服务调用性能优化  Microsoft Releases Web Service Software Factory
定义web service接口的十点注意事项  ASP.NET创建Web服务之声明
ASP.NET创建Web服务之设计方针  ASP.NET创建Web服务之XML基础结构
创建数据库Web Services  客户端访问Web Service方法的一个细节
使用WCF的Web编程模型开发REST风格的Web Service  SharePoint Web Services入门
新浪短信Web Service  Amazon宣布AWS挑战优胜者
实现COM组件向Web Services的转变  Arjen Poutsma谈Spring Web Services
XML Web Service 安全性  根据托管类库创建WebService代码
在Web Services中管理Sessions  实现Web Service依赖倒置