在不使用HttpModule的情况下处理声明性的每请求数据

时间:2009-06-11 09:11:46

标签: asp.net idisposable httpcontext

我有一个'context'对象,通过静态Current属性将自己绑定到HttpContext.Items。该对象可以通过表达式构建器和控件直接使用,它们都是同一个库的一部分。

我遇到的问题是,当请求结束而不使用HttpModule时,我想要处理它的托管资源(WCF客户端)(因为否则不需要)。我已经实施了full disposable pattern(使用Finaliser),但您不能及时依赖GC终结实例。

我试图在对象构造函数中为HttpApplication.EndRequest(也是PostRequestHandlerExecute)订阅一个静态方法(带锁定以确保它只发生一次),但是从不调度该事件。这可能是因为HttpApplication的实例发生了变化,但我并不完全确定。

关于解决这个问题的最佳方法的任何想法?

1 个答案:

答案 0 :(得分:1)

订阅静态事件请求将导致内存泄漏。它可以防止收集来自车库的请求,因为它包含对HttpApplication的引用。

如果要对HttpContext.Items中缓存的项目调用dispose,则需要在请求结束时执行此操作。如果您不想使用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();
    }
}