ASP.NET Webフォームアプリケーションには、IFrame内に別のコンテンツページを含む親フォームがあります。ユーザーがコンテンツページ内のリンクをクリックすると、長時間実行されるプロセス(> 30分)が開始されます。完了すると、処理されたレコードの数を示すポップアップがユーザーに表示されます。
Web.configのデフォルトの20分を変更せずに、プログラムでセッションタイムアウトを防ぐ必要があります。私はここに投稿されたハートビートの例を実装しようとしています(そしてWeb全体で、それが機能するはずです) ASP.NETセッションを開いたまま/生き たままにしますが、それは主にアイドルセッションに使用されているようです。
私の場合、コンテンツページリクエストがサーバー側に送られ、長時間実行されるプロセスが開始されると、HTTPハンドラーは呼び出されません。プロセスが完了すると、すべての呼び出しは、「キューに入れられた」ようにすぐに次々に行われます。
これが私のHTTPハンドラーです:
<%@ WebHandler Language="VB" Class="KeepSessionAliveHandler" %>
Imports System
Imports System.Web
Public Class KeepSessionAliveHandler
Implements IHttpHandler, SessionState.IRequiresSessionState
Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
context.Session("heartbeat") = DateTime.Now
context.Response.AddHeader("Content-Length", "0")
End Sub
Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
End Class
親ページのHead要素のJavascript関数。8秒ごとにハンドラーを呼び出す間隔を作成します(本番環境では10分に延長されます)。
function KeepSessionAlive()
{
if (intervalKeepAliveID)
clearTimeout(intervalKeepAliveID);
intervalKeepAliveID = setInterval(function()
{
$.post("KeepSessionAliveHandler.ashx", null, function()
{
// Empty function
});
}, 8000);
}
intervalKeepAliveID
アプリケーションのすべてのページに含まれるメインのJavascriptファイルで宣言されます。
これは、コンテンツページのヘッドにある私のonclickイベントのコードです。
$(document).ready(function()
{
// Ensuring my code is executed before ASP.NET generated script
$("#oGroup_lnkSubmit_lnkButton").attr("onclick", null).removeAttr("onclick").click(function()
{
// Prevent the browser from running away
// e.preventDefault();
window.parent.KeepSessionAlive();
// Wave goodbye
//window.location.href = $(this).attr('href');
WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions($(this).attr("name"), "", true, "", "", false, false));
});
});
どこかでJavascriptが単一のスレッドで実行されることを読みましたが、繰り返しの間隔がコンテンツページの外にあるという事実を考えると、これがここに当てはまるとは思わない...