让你的网站"心跳"起来

简介:

有时候你希望你的页面“一直活着”。也就是说,如果一个用户填写一个复杂的表单,在用户完成之前。你一定不希望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,如需转载请自行联系原作者




相关文章
|
消息中间件 存储 运维
Rabbitmq消息大量堆积怎么办?
该文讨论了一个系统架构问题,主要涉及RabbitMQ在处理订单消息时遇到的性能瓶颈。首先,系统使用RabbitMQ是为了解耦和提高性能,前端创建订单后通过RabbitMQ发送消息给订单履约系统消费并执行后续操作。当订单流量激增时,消息堆积导致服务器压力增加。 排查解决方案: 1. 增加消费者以提高消费速度,但发现即使增加消费者,消息堆积问题仍未解决。 2. 分析消费者逻辑,发现调用库存系统接口可能导致处理速度慢。库存系统压力大,接口响应慢,加剧问题。 3. 实施清空堆积消息的策略,新建消费者快速消费消息并存储在表中,减轻服务器压力。待库存服务恢复后,再将消息推回RabbitMQ处理。
802 1
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
1151 1
|
3月前
|
存储 文件存储 数据安全/隐私保护
阿里云企业邮箱收费标准价格:免费版/标准版/尊享版/集团版费用及功能对比
阿里云企业邮箱提供免费版、标准版、尊享版和集团版,满足不同企业需求。免费版适合初创团队,标准版性价比高,尊享版适合高存储需求企业,集团版适用于大型集团。价格从0元到9500元/年不等,支持多账号、大容量网盘及高级权限管理。企业可根据规模与功能需求选择合适版本。
526 12
|
12月前
|
存储 数据可视化 数据挖掘
R语言在生物信息学中的应用
【10月更文挑战第21天】生物信息学是生物学、计算机科学和信息技术相结合的交叉学科,主要研究生物大分子信息的存储、处理、分析和解释。R语言作为一种强大的统计分析工具,被广泛应用于生物信息学领域。本文将介绍R语言在生物信息学中的应用,包括基因组学、转录组学、蛋白质组学、代谢组学等方面,帮助读者了解R语言在生物信息学中的重要性和应用前景。
468 4
|
10月前
Next.js 实战 (二):搭建 Layouts 基础排版布局
本文介绍了作者在Next.js v15.x版本发布后,对一个旧项目的重构过程。文章详细说明了项目开发规范配置、UI组件库选择(最终选择了Ant-Design)、以及使用Ant Design的Layout组件实现中后台布局的方法。文末展示了布局的初步效果,并提供了GitHub仓库链接供读者参考学习。
311 1
Next.js 实战 (二):搭建 Layouts 基础排版布局
|
11月前
|
应用服务中间件 API nginx
nginx配置反向代理404问题
【10月更文挑战第18天】本文介绍了使用Nginx进行反向代理的配置方法,解决了404错误、跨域问题和302重定向问题。关键配置包括代理路径、请求头设置、跨域头添加以及端口转发设置。通过调整`proxy_set_header`和添加必要的HTTP头,实现了稳定的服务代理和跨域访问。
2669 1
nginx配置反向代理404问题
|
11月前
|
测试技术 开发者 UED
探索软件测试的深度:从单元测试到自动化测试
【10月更文挑战第30天】在软件开发的世界中,测试是确保产品质量和用户满意度的关键步骤。本文将深入探讨软件测试的不同层次,从基本的单元测试到复杂的自动化测试,揭示它们如何共同构建一个坚实的质量保证体系。我们将通过实际代码示例,展示如何在开发过程中实施有效的测试策略,以确保软件的稳定性和可靠性。无论你是新手还是经验丰富的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
12月前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
424 5
|
弹性计算 安全 Cloud Native
Alibaba Cloud Linux镜像系统超好用!兼容CentOS生态,性能稳定性绝对可以!
Alibaba Cloud Linux是阿里云的自研Linux发行版,兼容CentOS/RHEL,提供长期免费支持。它针对云服务器ECS优化,适用于多种场景,如Web服务、云原生应用等。Alibaba Cloud Linux 3基于Anolis OS 8,提供安全、高性能、十年维护及丰富的开源生态。用户可在ECS购买时选择镜像安装,支持多架构并提供热补丁、解决方案和快速启动版。更换ECS操作系统是免费的。
1982 5
|
存储 负载均衡 监控
Linux-虚拟机迁移步骤
虚拟机迁移步骤
495 0