2

Asp.net Web サービスがあります。メソッド M1 があります。M1 は、セッションごとにフォルダーを作成します。セッションの有効期限が切れたら、次のコードを使用して global.asax 内のそのフォルダーを削除します。

void Session_End(object sender, EventArgs e)
    {
        try
        {
            System.IO.DirectoryInfo dirMyPacksFolder = new System.IO.DirectoryInfo(Utilities.getMyPacksFolder(Session));
            //dirMyPacksFolder.Parent.CreateSubdirectory("ended_" + Session.SessionID);
            if (dirMyPacksFolder.Exists)
            {
                dirMyPacksFolder.Delete(true);
            }
        }
        catch (Exception ex)
        {
            Utilities.logException("", ex);
        }
    }

ブラウザで Web サービスを開いて M1 を呼び出すと、正しく動作し、設定したタイムアウトの有効期限にフォルダが削除されます。しかし、Webサービスの「呼び出し」ボタンを2回目に送信すると(セッションタイムアウトとフォルダーが削除された後)、そのセッションが開始(フォルダーの作成)され、設定したタイムアウトの直前に終了(フォルダーの削除)されます。

なぜこれが起こるのですか?

メソッド呼び出しごとに新しいウィンドウ (新しいセッション) を開くと、すべて問題ありません。しかし、「Invoke」ボタンを2回クリックすると問題が発生します。これは、同じセッションのキャッシュの問題のようなものです。

4

3 に答える 3

3

この投稿を見てください。あなたの問題は似ていると思います:

  • クライアントは期限切れのセッションのセッション ID を含む Cookie を送信します
  • サーバーは、クライアントから送信された ID を再利用して、新しいセッションを作成します
  • リクエストがセッションにアクセスしない場合、セッションはすぐに破棄されます。

WebMethod は実際にセッション状態にアクセスしますか? そうでない場合は、ダミーのセッション変数へのアクセスを追加してみてください。

アップデート:

Global.asaxの次のコード行は、問題を解決します。

 void Session_Start(object sender, EventArgs e)
 {
     Session["dummy"] = "dummy session for solving immediate session expire";
 }

更新 2

個人的には、Session_Start でディレクトリを作成しません。EnsureMyPacksFolder代わりに、フォルダーにアクセスしようとする前にアプリが呼び出す必要があるようなメソッドを呼び出します。これは次のようになり、「ダミー」セッション変数が不要になり、実際に必要な場合にのみフォルダが作成されることを意味します。

Global.asax:

void Session_Start(object sender, EventArgs e)
{
     // No code needed in Session_Start
}

void Session_End(object sender, EventArgs e)
{
    if (Session["MyPacksFolder"] != null)
    {
        // Folder has been created, delete it
        // ... add code to delete folder as above
    }
}

何処か別の場所:

public static void EnsureMyPacksFolder()
{
    if (Session["MyPacksFolder"] == null)
    {
        // Add code to create MyPacksFolder that was previously in Session_Start

        Session["MyPacksFolder"] = true;
    }
}
于 2012-07-07T12:28:49.453 に答える
0

Webサービスパスの下にフォルダーを作成および削除する場合、iisはすぐに再起動します。この投稿を見てください。

于 2012-07-07T11:52:56.540 に答える
0

WebMethods に以下を追加しましたか?

[WebMethod (EnableSession = true)]
于 2012-07-07T11:45:19.617 に答える