让你的网站“心跳”起来2011-03-26 博客园 朱祁林有时候你希望你的页面“一直活着”。也就是说,如果一个用户填写一个复杂的表单 ,在用户完成之前。你一定不希望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、在页面上我们必须有一个ScriptManager2、ScriptManager 的EnablePageMethods 必须设置成true3、WebMethod 方法必须是public和static的4、WebMethod 方法必须将EnableSession属性设置成true1 <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