2

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が単一のスレッドで実行されることを読みましたが、繰り返しの間隔がコンテンツページの外にあるという事実を考えると、これがここに当てはまるとは思わない...

4

2 に答える 2

2

JSがシングルスレッドであることに問題はありません-AJAXのAは非同期を表します-たとえば、ブロックしません(ブロックするように指示しても、応答が受信されるまで状態を保持するだけです)

このMSDNの記事から...

ASP.NETセッション状態へのアクセスはセッションごとに排他的です。つまり、2人の異なるユーザーが同時に要求を行うと、それぞれの個別のセッションへのアクセスが同時に許可されます。ただし、(同じSessionID値を使用して)同じセッションに対して2つの同時要求が行われた場合、最初の要求はセッション情報への排他的アクセスを取得します。2番目の要求は、最初の要求が終了した後にのみ実行されます。(最初の要求がロックタイムアウトを超えたために情報の排他ロックが解放された場合も、2番目のセッションにアクセスできます。)@ PageディレクティブのEnableSessionState値がReadOnlyに設定されている場合、読み取り専用の要求セッション情報によって、セッションデータが排他的にロックされることはありません。でも、

問題の詳細な説明と、ブロッキングの実装方法と潜在的な回避策をより細かく制御できる回避策については、このページを参照してください。

于 2013-03-25T16:24:05.477 に答える
0

ここには、お互いが正しく動作するのを妨げている可動部品がいくつかあると思います。

  • プロセスはサーバースレッドで実行されているため、これにより他のリクエストの処理がブロックされます。
  • キープアライブはサーバーからの応答の取得に依存しているため、完了しません。

サーバーが着信要求を処理し続けることができるように、ASP.NET SignalRのようなソリューションを検討し、長時間実行されるプロセスを別のスレッドとして生成することをお勧めします。

于 2013-03-25T17:45:44.303 に答える