2

静的な Current プロパティを介して HttpContext.Items に結び付けられる「コンテキスト」オブジェクトがあります。このオブジェクトは、すべて同じライブラリの一部である式ビルダーおよびコントロールを介して直接使用できます。

私が遭遇している問題は、リクエストが HttpModule を使用せずに終了したときに、マネージド リソース (WCF クライアント) を破棄したいということです (それ以外の場合は必要ないため)。完全な破棄可能なパターン(Finaliser を使用)を実装しましたが、タイムリーにインスタンスをファイナライズする GC に依存することはできません。

オブジェクト コンストラクターで静的メソッドを HttpApplication.EndRequest (PostRequestHandlerExecute も) にサブスクライブしようとしましたが (一度だけ発生するようにロックして)、イベントは決してディスパッチされません。完全にはわかりませんが、これはおそらく HttpApplication のインスタンスが変更されたためです。

これを解決する最善の方法について何か考えはありますか?

4

1 に答える 1

1

リクエストを静的イベントにサブスクライブすると、メモリ リークが発生します。HttpApplication への参照を保持しているため、リクエストがガレージ収集を開始するのを防ぎます。

キャッシュされたアイテムで dispose を呼び出したい場合HttpContext.Itemsは、リクエストの最後でこれを行う必要があります。HttpModule を使用したくない場合は、Global.ascx を使用してEndRequestイベントをフックします。

void Global_EndRequest(object sender, EventArgs e)
{
    var app = (HttpApplication)sender;
    var disposableItem = app.Context.Items["disposableItem"] as IDisposable;
    if (disposableItem != null)
    {
        disposableItem.Dispose();
    }
}
于 2011-08-29T12:33:40.717 に答える