1

ASP.NETと ERP システムである Microsoft Dynamics AX 4.0 に基づく電子商取引システムを開発しました。

HTTP セッションごとに、.NET コンポーネントである「ビジネス コネクタ」を使用して ERP システムにログオンします。ビジネス コネクタ」オブジェクトは、セッション変数に保存されます。したがって、通常のSession_endで、Dynamics AX からログアウトし、すべてのリソースをクリーンアップします。

ERP システムは 32 ビット ベースのシステムであり、リソースを節約するために、一定時間非アクティブになった後に ERP システムからログアウトするタイマーを開発したいと考えています。2分としましょう。HTTP セッションのタイムアウトは 20 分に設定されています。

System.Timers.TimerユーザーがERPシステムに関連するもの(アイテム、バスケットなど)をクリックするたびにタイマーを開始および再起動する、を使用するクラス「TimerHandler」を作成しました。

コード例:

public class ErpHandler
{
    private ErpTimerHandler TimerHandler
    {
        get
        {
            if (HttpContext.Current != null)
            {
                if (HttpContext.Current.Session["TimerHandler"] != null)
                {
                    return (ErpTimerHandler)HttpContext.Current.Session["TimerHandler"];
                }
            }
            return null;
        }
       set
        {
            if (HttpContext.Current != null)
            {
                HttpContext.Current.Session["TimerHandler"] = value;
            }
        }
    }

    private void StartTimer()
    {
        ErpTimerHandler timer = TimerHandler;
        if timer == null)
        {
            timer = TimerHandler.Instance();
            timer.TimerEvent += OnTimedEvent;   
            TimerHandler = timer;
        }

        timer.StartTimer();

    }

    private void StopTimer()
    {
        ErpTimerHandler timer = TimerHandler;
        if (timer != null)
        {
            timer.StopTimer();
            TimerHandler = null;
        }
    }

    private void OnTimedEvent(Object source, EventArgs e)
    {
        StopTimer();
        ErpLogOff();
    }

    public void ErpLogOff()
    {
        ErpSystem erp = ErpInstance;            
        if (LoggedOnErp && erp != null)
        {
            erp.Logoff();
            ErpInstance = null;
        }
        LoggedOnErp = false;

    }
}

このコードは nullOnTimedEventであるため、Erp on からログオフすることはありません。HttpContext.Current.Session

私が理解していることから、タイマーは別のスレッドで実行されているため、必要なときに現在のセッションを利用できません。

では、どうすればそのスレッドに「到達」できますか? または、タイマーがセッションと同じスレッドで実行されていることを確認できますか?

4

1 に答える 1

1

HttpContext.Currentリクエストの存続期間中のみ有効です。タイマーがトリガーされると、リクエストはおそらく長い間処理されて完了しています。

特定のユーザーのデータを処理したい場合は、セッション辞書から一種のデータ ホルダーに情報をコピーする必要があります。

これは、組み込みのキャッシュを使用してセッションの有効期限が切れたことを検出するソリューションです: http://www.ivan-nikolov.com/en/article/5/asp-net-session-state-mode-and-session-end-折り返し電話

このソリューションは基本的に、ユーザーがログインしたときにアイテムをキャッシュに挿入し、リクエストごとにキャッシュを更新します。最後に、キャッシュの有効期限イベントを使用して、セッションの有効期限が切れたことを検出します。

于 2014-05-26T13:52:18.860 に答える