2009-06-30 128 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」,這樣效果更好。