2009-06-30 132 views
8

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

问题是,我需要会话保持活动状态才能进行身份验证,但会话将会超时,即使用户正在使用Silverlight应用程序的功能。

任何想法?

+0

你可以使用计时器吗? – WowtaH 2009-06-30 21:12:27

回答

12

在托管silverlight控件的页面上,您可以设置一个javascript计时器并每隔5分钟对一个Http Handler(.ashx)执行一次ajax调用以保持会话的活跃。一定要让你的H​​andler类实现IRequiresSessionState

我推荐处理程序,因为它更容易控制返回的响应文本,并且它比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调用的工具。

+0

它比几乎空白的aspx页面更轻量? 我是ASP.NET/AJAX的新手,这看起来更复杂。你能提供我需要使用的ashx文件的样本吗? – 2009-06-30 22:00:36

+0

我试过这个,而且JavaScript在IE8中似乎不起作用。我刚刚为此目的下载了最新版本的jQuery。 处理程序/页面需要其他东西吗? – 2009-07-02 22:26:59

0

我实际上已经发现了一个非常酷的hack,它基本上在与silverlight应用程序相同的页面上嵌入了一个iframe。 iframe包含一个aspx网页,每隔(Session.Timeout - 1)分钟刷新一次。这会使Silverlight应用程序打开的时间长久。

要做到这一点:

创建一个名为 “KeepAlive.aspx” 一个asp.net页面。在该页面的头部分,补充一点:

<meta id="MetaRefresh" http-equiv="refresh" content="18000;url=KeepAlive.aspx" runat="server" /> 

    <script language="javascript" type="text/javascript"> 
     window.status = "<%= WindowStatusText%>"; 
    </script> 

在代码隐藏文件,补充一点:

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应用程序上,补充一点:

<iframe id="KeepAliveFrame" src="KeepAlive.aspx" frameborder="0" width="0" height="0" runat="server" /> 

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

+0

不幸的是,它看起来像在IE8(至少)中不起作用。 – 2009-07-02 19:28:54

0

ajax ping/HttpHandler方法很好,但是JQuery $ .get函数需要json结果并引发javascript解析错误。

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