使用Silverlight时防止ASP.NET会话超时

我正在编写一个既包含ASP.NET配置系统又包含Silverlight应用程序的程序。 大多数用户将保留在Silverlight页面上,除了登录等外,不会访问ASP.NET站点。

问题是,我需要会话保持活动以进行身份​​validation,但即使用户使用silverlight应用程序的function,会话也会超时。

有任何想法吗?

在托管silverlight控件的页面上,您可以设置一个javascript计时器并每隔5分钟对Http Handler(.ashx)执行ajax调用以保持会话处于活动状态。 确保您的Handler类实现IRequiresSessionState

我推荐使用Handler,因为它更容易控制返回的响应文本,并且它比aspx页面更轻量级。

您还需要正确设置响应缓存,以确保浏览器每次都进行ajax调用。

UPDATE

以下是HttpHandler的示例代码

 public class Ping : IHttpHandler, IRequiresSessionState { public void ProcessRequest(HttpContext context) { context.Response.Cache.SetCacheability(HttpCacheability.NoCache); context.Response.ContentType = "text/plain"; context.Response.Write("OK"); } public bool IsReusable { get { return true; } } } 

然后,如果你使用jQuery,你可以将它放在你的主机aspx页面上

 setInterval(ping, 5000); function ping() { $.get('/Ping.ashx'); } 

间隔以毫秒为单位,因此我的示例将每5秒ping一次,您可能希望它是一个更大的数字。 Fiddler是调试ajax调用的好工具,如果不使用它,请启动。

我实际上发现了一个非常酷的黑客,它基本上将一个iframe嵌入到与silverlight应用程序相同的页面上。 iframe包含一个aspx网页,每隔(Session.Timeout – 1)分钟刷新一次。 无论Silverlight应用程序打开多长时间,都会使会话保持活动状态。

去做这个:

创建一个名为“KeepAlive.aspx”的asp.net页面。 在该页面的head部分中,添加以下内容:

   

在代码隐藏文件中,添加以下内容:

 protected string WindowStatusText = ""; protected void Page_Load(object sender, EventArgs e) { if (User.Identity.IsAuthenticated) { // Refresh this page 60 seconds before session timeout, effectively resetting the session timeout counter. MetaRefresh.Attributes["content"] = Convert.ToString((Session.Timeout * 60) - 60) + ";url=KeepAlive.aspx?q=" + DateTime.Now.Ticks; WindowStatusText = "Last refresh " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString(); } } 

现在,在与silverlight应用程序相同的页面上,添加以下内容:

  

现在,当使用silverlight应用程序时,asp.net会话将保持活动状态!

ajax ping / HttpHandler方法很好,但是JQuery $ .get函数期望json结果并抛出javascript解析错误。

我修改了Ping HttpHandler以返回“{}”而不是“OK”,这样做效果更好。