0

InProc セッションを使用する ASP.NET アプリケーションでは、Session_End が別のオブジェクトの静的メソッドを呼び出して、セッション固有のクリーンアップを行います。このクリーンアップでは、アプリケーション状態に保存している共有データベース接続を使用します。

問題は、アプリケーションの状態 (またはデータベース接続) をパラメーターとしてクリーンアップ メソッドに渡さないと、アプリケーションの状態にアクセスする方法がわからないことです。私はリクエストに参加していないため、現在の HttpContext がなく、状態にアクセスするための他の静的メソッドが見つかりません。

何か不足していますか?

更新:私の質問にはさらに説明が必要なようですので、次のコードサンプルを試してみましょう. 私ができるようにしたいのは:

// in Global.asax
void Session_End(object sender, EventArgs e) 
{
    NeedsCleanup nc = Session["NeedsCleanup"] as NeedsCleanup;
    nc.CleanUp();
}

しかし問題は、CleanUpメソッドがアプリケーションの状態に格納されている情報を必要とすることです。私はすでに次のことを行っていますが、それはまさに私が避けたかったことです。これが、上記の「...渡さずに... クリーンアップ メソッドのパラメーターとして」という意味です。

// in Global.asax
void Session_End(object sender, EventArgs e) 
{
    NeedsCleanup nc = Session["NeedsCleanup"] as NeedsCleanup;
    nc.CleanUp(this.Application);
}

オブジェクトがどこで情報を取得するかを知る必要がGlobal.asax あるという考えは好きではありません。NeedsCleanupクラス内で自己完結型としてより理にかなっているようなもの。

4

3 に答える 3

3

Session_End 内から Application プロパティを使用して、ApplicationState オブジェクトにアクセスできるはずです。

void Session_End(object sender, EventArgs e) 
{
     HttpApplicationState state = this.Application;
}

(直接コメントするのに必要な評判がないため、別の回答で返信する必要がありました)

于 2008-10-06T05:06:47.443 に答える
1

Session_End 内から Session プロパティを使用して、SessionState オブジェクトにアクセスできるはずです。

void Session_End(object sender, EventArgs e) 
{
    HttpSessionState session = this.Session;
}

このプロパティとその他のプロパティは、Global.asax の基本クラスから取得されます。

于 2008-10-05T05:18:40.040 に答える
0

「NeedsCleanup」インスタンスはどこに作成していますか? それが Session_Start にある場合、グローバル クラスがこれらのインスタンスをいつどのように作成および破棄するかを知っていることは理にかなっています。

NeedsCleanup のクリーンアップを呼び出し元から分離したいというご要望を承りました。おそらく、「HttpContext.Current.ApplicationInstance」と「this」参照を介してグローバルクラスの両方で見つかった「HttpApplication」インスタンスを渡すほうが、よりクリーンな方法です。または、構築時に前述のインスタンスのいずれかを指定することもできます。これにより、クリーンアップの結合が少なくなります。

于 2008-10-07T04:38:43.363 に答える