0

こんにちは、私は asp.net SESSIONS がどのように機能するかについてあまり詳しくありませんが、いくつか読んだ後、あまり努力せずに問題を解決するのに役立つことがわかりました。

私の問題は、ユーザーがサーバーにドキュメントをアップロードすることは許可されているが、投稿ボタンを押すまで実際にはデータベースに保存できないという状況に関連しています。

ドキュメントをアップロードしてブラウザを閉じると、ドキュメントはファイルシステムに残り、どのドキュメントがそこに保存されたかを知る方法はありません。

この問題を解決するために、ファイル システムに保存される実際のドキュメントではなく、ドキュメントの詳細をセッションに保存することにしました。

ページが最初にロードされると、セッションに保存されたデータに基づいてファイルシステムのクリーンアップが実行されます。

残っているのは、ユーザーがブラウザーを閉じて、その間にセッションが期限切れになる場合を処理できることだけです。

いくつかの調査の結果、ブラウザを閉じてもセッションが期限切れになると、Session_OnEnd メソッドが runes であることがわかったので、ここにコードを追加しました。

 public void Session_OnEnd()
 {
    var session = Session[Constants.FILE_SHARE_DOCUMENT];
    if (session != null)
    {
        var documents = (List<Document>)session;
        foreach (var document in documents)
        {
            string filePath = Path.Combine(Constants.SERVER_PATH, document.StorageFileName);
            File.Delete(filePath);
        }
    }
}

また、セッションの終了を 1 分に設定しましたが、試したすべてのケースでうまくいくようです。

これが私の問題を解決する信頼できる方法であるかどうか、誰でも確認できますか?

不足しているものはありますか?

4

1 に答える 1

2

これは、いくつかの理由から信頼できるメカニズムではありません。

まず、セッションを 1 分に設定しますか? それほど長くはありません.1分間一時停止したユーザーのセッションを終了させたいですか? テストのために1分に設定したということですか?通常、セッション タイムアウトは 20 分程度です。

次に、ワーカー プロセスがリサイクルされる場合、Session_End は呼び出されません。これは、ワーカー プロセスがクラッシュした場合、スケジュールに従ってリサイクルするように設定されている場合、または手動でリサイクルされた場合に発生する可能性があります。

タイムスタンプが特定の時間よりも大きいすべてのファイルをクリーンアップ プロセスで削除するだけです。シンプルで簡単です。

于 2013-10-12T18:06:16.030 に答える