让你的网站"心跳"起来

简介:

有时候你希望你的页面“一直活着”。也就是说,如果一个用户填写一个复杂的表单,在用户完成之前。你一定不希望session过期。否者用户可能因此变得非常恼怒。
    这也不是简单的加长session过期时间的事情。如果你这样做,当访问页面的用户离开这个网站,session将会仍旧存活在服务器的内存中很长一段时间。增加session过期时间是一个解决办法,但是它不是一个很好的解决办法。
    我的目标是:一旦网页在客户端被打开,session就一直激活。即使没有任何回发来重设session的时间。当网页关闭的时候,session将自然结束。
    我这样来实现这个解决方案:在客户端每隔一段时间就去"ping"服务端,这个时间少于session的过期时间。这就是Heartbeat设计模式。
麻烦的设置:   
     为了达到测试的目的。我在web.config中设置session超时时间为2分钟。

1  < system.web >
2     < sessionState  timeout ="2" >
3     </ sessionState >
4    </ system.web >

    为了追踪具体发生了什么,使用一个公用的函数ODS(在MiscUtilities类中)

复制代码
1  //  ---- ODS (Output Debug String) ----------------------
2  public   static   void  ODS( string  Msg)
3  {
4      String Out  =  String.Format( " {0}  {1} " , DateTime.Now.ToString( " hh:mm:ss.ff " ), Msg);
5      System.Diagnostics.Debug.WriteLine(Out);
6  }
7 
复制代码

    为了观察session的状态事件,我在global.asax中添加用于调试的字符串。

复制代码
 1  <% @ Application Language = " C# "   %>
 2  < script RunAt = " server " >
 3        
 4       void  Application_Start( object  sender, EventArgs e)
 5      {
 6          MiscUtilities.ODS( " ****ApplicationStart " );
 7      }
 8       void  Session_Start( object  sender, EventArgs e)
 9      {
10          MiscUtilities.ODS( " Session_Start " );
11      }
12       void  Session_End( object  sender, EventArgs e)
13      {
14          MiscUtilities.ODS( " Session_End " );
15      } 
16 
复制代码

    下面是详细步骤:由于我们需要在服务端有一个方法供客户端调用。故使用一个WebMethod方法。
1、在页面上我们必须有一个ScriptManager 
2、ScriptManager 的EnablePageMethods 必须设置成true
3、WebMethod 方法必须是public和static的
4、WebMethod 方法必须将EnableSession属性设置成true

1  < asp:ScriptManager  ID ="ScriptManager1"  runat ="server"  
2      EnablePageMethods ="true" >
3  </ asp:ScriptManager >

 

复制代码
1  public   partial   class  _Default : System.Web.UI.Page
2  {
3      [WebMethod(EnableSession = true  ) ]
4       public   static   void  PokePage()
5      {
6           //  called by client to refresh session
7          MiscUtilities.ODS( " Server: I am poked " );       
8      }
9 
复制代码

    我们需要有一个客户端的JavaScript定时地去调用服务端的方法。

复制代码
 1  < script type = " text/javascript " >
 2       var  HeartBeatTimer;
 3       function  StartHeartBeat()
 4      {
 5           //  pulse every 10 seconds
 6           if  (HeartBeatTimer  ==   null )
 7              HeartBeatTimer  =  setInterval( " HeartBeat() " 1000   *   10 );
 8      }
 9       function  HeartBeat()
10      {
11           //  note: ScriptManger must have: EnablePageMethods="true"
12          Sys.Debug.trace( " Client: Poke Server " );
13          PageMethods.PokePage();
14      }
15  < body id = " MyBody "   onload = " StartHeartBeat(); " >
16 
复制代码

    没有"心跳"的,输入如下:

1  10 : 22 : 43.03  ****ApplicationStart 
2  10 : 22 : 45.13  Session_Start 
3  10 : 25 : 00.00  Session_End 

    有"心跳"的,输出如下:

复制代码
 1  10 : 26 : 06.10   ****ApplicationStart
 2  10 : 26 : 08.05   Session_Start
 3  Client: Poke Server
 4  10 : 26 : 18.93   Server: I am poked
 5  Client: Poke Server
 6  10 : 26 : 28.95   Server: I am poked
 7  Client: Poke Server
 8  10 : 26 : 38.96   Server: I am poked
 9  Client: Poke Server
10  10 : 26 : 48.98   Server: I am poked
11 
12      . . . (lines deleted)
13 
14  Client: Poke Server
15  10 : 29 : 59.45   Server: I am poked
16  Client: Poke Server
17  10 : 30 : 09.47   Server: I am poked
18  Client: Poke Server
19  10 : 30 : 19.48   Server: I am poked
20 
21      . . . (lines deleted)
22 
复制代码

    这样看起来客户端闲置的时候,session仍然活着,也就是网站“心跳”着。 (有点扯淡) 




本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/03/26/AH-Ah-ah-ah-Staying-Alive-Staying-Alive.html,如需转载请自行联系原作者




相关文章
|
Java Windows
JavaWebSocket心跳机制详解
WebSocket是一种在Web浏览器和服务器之间进行全双工通信的协议,它提供了一种简单而强大的方式来实现实时数据传输。在使用WebSocket时,心跳机制是非常关键的,它能够保持连接的稳定性并及时发现连接的异常。本文将详细解释JavaWebSocket心跳机制的实现原理和步骤。
473 0
|
29天前
|
前端开发 JavaScript API
赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!
【8月更文挑战第17天】赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!
49 3
赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!
|
20天前
|
存储 分布式计算 Prometheus
什么是主动和被动的“NameNode”?
【8月更文挑战第31天】
22 0
|
3月前
|
消息中间件 Serverless 网络性能优化
消息队列 MQ产品使用合集之客户端和服务器之间的保活心跳检测间隔是怎么设置的
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
10月前
|
tengine 网络协议 Linux
关于长连接服务器和客户端之间要加入心跳的一些讨论
关于长连接服务器和客户端之间要加入心跳的一些讨论
|
Java 开发者
JavaHTTP心跳:服务器与客户端实时连接的实现方式
JavaHTTP心跳:服务器与客户端实时连接的实现方式 在网络通信中,实时连接是一种至关重要的功能。它允许服务器与客户端之间保持持久的通信信道,实现快速、高效的数据传输。对于Java开发者来说,实现服务器与客户端之间的实时连接可以通过JavaHTTP心跳技术来实现。本文将介绍如何利用JavaHTTP心跳来实现服务器与客户端之间的实时连接。
310 0
|
前端开发
WebSocket使用及优化(心跳机制与断线重连)
WebSocket使用及优化(心跳机制与断线重连)
2307 0
WebSocket使用及优化(心跳机制与断线重连)
|
缓存 负载均衡 中间件
Eureka服务下线太慢,电话被告警打爆了
某年某月的某一天,就像一张破碎的脸。。。 错了,重来。 某天,忽然发现大量的告警,经过多番调查研究考察(此处省略3000字),发现是由于 Eureka 服务下线太慢,而仍然有大量的请求打进来导致的报错。 于是,又经过了大量详细周密的考察和研究,终于找到了问题并且解决了(此处省略5000字)。 全文完。 ... ... 好了,那是不可能的啦,怎么说也要意思一下写个300字凑个原创啊
Eureka服务下线太慢,电话被告警打爆了
|
网络协议 开发者
长连接的心跳及重连设计(上)
什么场景下需要心跳呢? 目前我们接触到的大多是一些基于长连接的应用需要心跳来“保活”。 由于在长连接的场景下,客户端和服务端并不是一直处于通信状态,如果双方长期没有沟通则双方都不清楚对方目前的状态;所以需要发送一段很小的报文告诉对方“我还活着”。 同时还有另外几个目的: 服务端检测到某个客户端迟迟没有心跳过来可以主动关闭通道,让它下线。 客户端检测到某个服务端迟迟没有响应心跳也能重连获取一个新的连接。
长连接的心跳及重连设计(上)
|
网络协议 Dubbo 应用服务中间件
长连接的心跳及重连设计(下)
什么场景下需要心跳呢? 目前我们接触到的大多是一些基于长连接的应用需要心跳来“保活”。 由于在长连接的场景下,客户端和服务端并不是一直处于通信状态,如果双方长期没有沟通则双方都不清楚对方目前的状态;所以需要发送一段很小的报文告诉对方“我还活着”。 同时还有另外几个目的: 服务端检测到某个客户端迟迟没有心跳过来可以主动关闭通道,让它下线。 客户端检测到某个服务端迟迟没有响应心跳也能重连获取一个新的连接。
长连接的心跳及重连设计(下)