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

时间:2009-06-30 21:11:27

标签: c# asp.net silverlight authentication session

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

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

有什么想法吗?

3 个答案:

答案 0 :(得分:12)

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

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

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

<强>更新

以下是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调用的好工具,如果不使用它,请启动。

答案 1 :(得分:0)

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

要做到这一点:

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

<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会话将保持活动状态!

答案 2 :(得分:0)

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

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