質問

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);
}

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

役に立ちましたか?

解決

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

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

他のヒント

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

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

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

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

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

このプロパティなどは、Global.asaxの基本クラスからのものです

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top