2017-12-26 11 views
0

SQLiteSessionStateStoreProvider.DeleteExpiredSessions()は、IIS 7で任意の間隔で自動的に実行されません。セッション状態ストレージ用のデータベースがinProc上にある場合は、実行時に自動的に管理され、実際のSQLデータベース上にあった場合、クリアするためにSQLエージェントによって実行されるスクリプトが存在することを理解しています期限切れセッション。しかし、私の問題は、ライブラリに定義されている関数がライブラリに定義されているにもかかわらず、https://github.com/micahlmartin/SQLiteSessionStateStore(DeleteExpiredSessions()に改名され公開されました)IISサーバにこの関数を呼び出す方法が不明です。これを呼び出すバックエンドの私自身のものです。 IISサーバーでは、セッションの状態がカスタムに設定され、20分間隔で有効期限が切れます。サーバーのweb.configの設定と同じように、Cookieモードに設定されています。データベースは現在、セッション状態のために過去7日間のデータを保持しています。バックエンドからやり取りする方法が不明です。サービスや実装が欠落しています。 C#MVCを使用してSQLite経由でカスタムSessionStateProviderを実行した経験があれば誰でもこれを解決する方法を理解しているはずです。ありがとうございます。ASP.NETカスタムSQLite DeleteExpiredSessions()

答えて

0

はあなたのGlobal.asaxからこのような何かを試してみてください:

それは(DeleteExpiredSessionsを実行します)、約10分後。その間、0.25秒ごとにチェックし、アプリケーションがシャットダウンしているかどうかを確認します。シャットダウンしている場合は停止します。

public class Global : System.Web.HttpApplication 
{ 
    public static Task SessionCleanup { get; private set; } = null; 
    public static bool ApplicationEnding { get; private set; } 

    public static void PeriodicallyRunSesssionCleanup() 
    { 
     int cleanupInterval = 600000;//10 minutes 
     int sleepInterval = 250;// 1/4 second 
     while(!ApplicationEnding && cleanupInterval > 0) 
     { 
      Thread.Sleep(sleepInterval); 
      cleanupInterval -= sleepInterval; 
     } 
     if(!ApplicationEnding) 
     { 
      throw new NotImplementedException("Place your code that cleans up sessions here to have it run every 10 minutes."); 
      SessionCleanup = new Task(PeriodicallyRunSesssionCleanup); 
      SessionCleanup.Start(); 
     } 
    } 

    protected void Application_Start(object sender, EventArgs e) 
    { 
     SessionCleanup = new Task(PeriodicallyRunSesssionCleanup); 
     SessionCleanup.Start(); 
    } 

    protected void Application_End(object sender, EventArgs e) 
    { 
     ApplicationEnding = true; 
     if (SessionCleanup != null) SessionCleanup.Wait(); 
    } 
} 
+0

"DeleteExpiredSessions()"という名前は、現在のコンテキストに存在しません。 – tincopper2

+0

これは、https://github.com/micahlmartin/SQLiteSessionStateStore(DeleteExpiredSessions()に名前を変更してパブリックにする)で提供されている方法で、データベース内のクリーンアッププロシージャを呼び出します。 オンラインでは、msdnでもセッションクリーンアップ手順のいくつかの例があります。作成を手助けする必要がある場合や、別の質問でより適切に処理されるデータレイヤを実装する必要がある場合。あなたが関連する質問がある場合は私に教えてください。私は助けにジャンプします。 –

+0

データベースをクリーンアップするメソッドを呼び出すことはありません。これはプロバイダのインスタンスを参照せず、静的ライブラリのみを参照します。 – tincopper2

関連する問題