ユーザーがブラウザ ウィンドウを開いている間、ASP.NET セッションを維持する最も簡単で邪魔にならない方法はどれですか? 時間制限付きの AJAX 呼び出しですか? 次の状況を防ぎたいのですが、ユーザーがウィンドウを長時間開いたままにして何かを入力し、送信時にサーバー側のセッションが期限切れになったために何も機能しなくなることがあります。閉じたセッション (ブラウザ ウィンドウを閉じることによって) をすぐにタイムアウトさせたいので、サーバー上でタイムアウト値を 10 分以上に増やしたくありません。
提案、コードサンプルはありますか?
ベストアンサー1
私は JQuery を使用して、セッションを維持することだけを行うダミー HTTP ハンドラーへの単純な AJAX 呼び出しを実行します。
function setHeartbeat() {
setTimeout("heartbeat()", 5*60*1000); // every 5 min
}
function heartbeat() {
$.get(
"/SessionHeartbeat.ashx",
null,
function(data) {
//$("#heartbeat").show().fadeOut(1000); // just a little "red flash" in the corner :)
setHeartbeat();
},
"json"
);
}
セッション ハンドラーは次のようにシンプルになります。
public class SessionHeartbeatHttpHandler : IHttpHandler, IRequiresSessionState
{
public bool IsReusable { get { return false; } }
public void ProcessRequest(HttpContext context)
{
context.Session["Heartbeat"] = DateTime.Now;
}
}
重要なのは、IRequiresSessionState を追加することです。そうしないと、Session は利用できなくなります (= null)。もちろん、呼び出し元の JavaScript に何らかのデータを返す必要がある場合、ハンドラーは JSON シリアル化オブジェクトを返すこともできます。
web.config を通じて利用可能:
<httpHandlers>
<add verb="GET,HEAD" path="SessionHeartbeat.ashx" validate="false" type="SessionHeartbeatHttpHandler"/>
</httpHandlers>
追加したからバレクサンドル2012年8月14日
この例はとても気に入ったので、HTML/CSSとビート部分を改善したいです。
これを変える
//$("#heartbeat").show().fadeOut(1000); // just a little "red flash" in the corner :)
の中へ
beatHeart(2); // just a little "red flash" in the corner :)
そして追加する
// beat the heart
// 'times' (int): nr of times to beat
function beatHeart(times) {
var interval = setInterval(function () {
$(".heartbeat").fadeIn(500, function () {
$(".heartbeat").fadeOut(500);
});
}, 1000); // beat every second
// after n times, let's clear the interval (adding 100ms of safe gap)
setTimeout(function () { clearInterval(interval); }, (1000 * times) + 100);
}
HTMLとCSS
<div class="heartbeat">♥</div>
/* HEARBEAT */
.heartbeat {
position: absolute;
display: none;
margin: 5px;
color: red;
right: 0;
top: 0;
}
がここにありますライブ例叩く部分のみ:http://jsbin.com/ibagob/1/