我正在编写一个既有ASP.NET配置系统又有Silverlight应用程序的程序。大多数用户将保留在Silverlight页面上,除了登录等外,不会访问ASP.NET网站。使用Silverlight防止ASP.NET会话超时
问题是,我需要会话保持活动状态才能进行身份验证,但会话将会超时,即使用户正在使用Silverlight应用程序的功能。
任何想法?
我正在编写一个既有ASP.NET配置系统又有Silverlight应用程序的程序。大多数用户将保留在Silverlight页面上,除了登录等外,不会访问ASP.NET网站。使用Silverlight防止ASP.NET会话超时
问题是,我需要会话保持活动状态才能进行身份验证,但会话将会超时,即使用户正在使用Silverlight应用程序的功能。
任何想法?
在托管silverlight控件的页面上,您可以设置一个javascript计时器并每隔5分钟对一个Http Handler(.ashx)执行一次ajax调用以保持会话的活跃。一定要让你的Handler类实现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调用的工具。
它比几乎空白的aspx页面更轻量? 我是ASP.NET/AJAX的新手,这看起来更复杂。你能提供我需要使用的ashx文件的样本吗? – 2009-06-30 22:00:36
我试过这个,而且JavaScript在IE8中似乎不起作用。我刚刚为此目的下载了最新版本的jQuery。 处理程序/页面需要其他东西吗? – 2009-07-02 22:26:59
我实际上已经发现了一个非常酷的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会话将保持活动状态!
不幸的是,它看起来像在IE8(至少)中不起作用。 – 2009-07-02 19:28:54
ajax ping/HttpHandler方法很好,但是JQuery $ .get函数需要json结果并引发javascript解析错误。
我修改了Ping HttpHandler以返回“{}”而不是“OK”,这样效果更好。
你可以使用计时器吗? – WowtaH 2009-06-30 21:12:27