2009-06-30 12 views
8

私は、ASP.NET構成システムとSilverlightアプリケーションの両方を持つプログラムを作成しています。ほとんどのユーザーはSilverlightページに残り、ログイン以外はASP.NETサイトにアクセスしません。Silverlightを使用するときのASP.NETセッションタイムアウトの防止

問題は、認証の目的でセッションをアクティブにしておく必要がありますが、ユーザーはSilverlightアプリの機能を使用しています。

アイデア?

+0

タイマーを使用できますか? – WowtaH

答えて

12

Silverlightコントロールをホストするページで、セッションを有効に保つために、JavaScriptタイマーをセットアップし、5分ごとにHTTPハンドラ(.ashx)へのajax呼び出しを行うことができます。 HandlerクラスにIRequiresSessionStateを実装させてください。

返される応答テキストを制御する方が簡単で、aspxページよりも軽量であるため、Handlerを推奨します。

また、ブラウザが毎回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ファイルのサンプルを提供できますか? –

+0

これを試してみましたが、javascriptはIE8では動作していないようです。私は、この目的のためにjQueryの最新バージョンをダウンロードしました。 ハンドラ/ページに必要なことがありますか? –

+0

必要なものは他にありません。 Fiddler2という素晴らしいツールがあり、ネットワークトラフィックを監視し、通話が確実に行われていることを確認することができます。パスの問題になる可能性があります。この場合、フィドラーは404を報告します。そのツールを使用して何が起きているのかを確認することをお勧めします。それ以外の場合、IE8には良いjavascriptデバッグツールが用意されています。 – NerdFury

0

私は本質的に銀色のアプリケーションと同じページにiframeを埋め込む非常にクールなハックを見つけました。 iframeには、(Session.Timeout - 1)分ごとにリフレッシュするaspxウェブページが含まれています。これは、銀色のアプリが開いている間、セッションを生きています。

は "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セッションが有効になります。

+0

残念ながら、これはIE8で動作しないようです(少なくとも)。 –

0

ajax ping/HttpHandlerアプローチは良いですが、JQuery $ .get関数はjson結果を期待しており、javascript解析エラーをスローします。

"OK"の代わりに "{}"を返すようにPing HttpHandlerを修正しました。これがうまく機能しました。

+0

$ .getを使用するときに取得する応答のタイプを指定できます – Omu

関連する問題