我有一个'context'对象,通过静态Current属性将自己绑定到HttpContext.Items。该对象可以通过表达式构建器和控件直接使用,它们都是同一个库的一部分。
我遇到的问题是,当请求结束而不使用HttpModule时,我想要处理它的托管资源(WCF客户端)(因为否则不需要)。我已经实施了full disposable pattern(使用Finaliser),但您不能及时依赖GC终结实例。
我试图在对象构造函数中为HttpApplication.EndRequest(也是PostRequestHandlerExecute)订阅一个静态方法(带锁定以确保它只发生一次),但是从不调度该事件。这可能是因为HttpApplication的实例发生了变化,但我并不完全确定。
关于解决这个问题的最佳方法的任何想法?
答案 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();
}
}