我正在編寫一個既有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