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 回答