繁体   English   中英

在application_endrequest上部署对象上下文

[英]disposing object context on application_endrequest

我遇到了EF4对象上下文的问题,我将其存储在HttpContext.Current.Items中 ,然后在完全处理请求后立即处理。

在Aplication_EndRequest事件中,我调用RepositoryContext的Terminate()方法,该方法将从HttpContext.Current.Items集合中找到活动的ObjectContext ,并在其连接上调用Close()并在其上调用Dispose()

问题是,有时候我的某个页面会出现奇怪的行为。 在某些情况下,我得到一个错误说:

ObjectContext实例已被释放,不能再用于需要连接的操作

我想也许这可能发生,因为不仅页面请求一旦完成就会调用Application_EndRequest事件,而且还会调用图像请求等等,因此有时其他请求可能会在完成其工作之前处理主页面请求ObjectContext,但这应该是因为一切都是在集合HttpContext.Current.Items上进行的,所以当然不能在HTTP请求之间共享。

此外,从研究可能是由于一些数据库请求的延迟加载引起的,但这不应该是这里的情况,因为我没有在代码上的其他任何地方调用Dispose(我已经检查过),因此EndRequest上的Dispose()应该只有在一切都结束时才会被召唤,不应该吗?

关于可能导致这种情况的任何想法? 我该怎么测试呢? 你会建议什么?

谢谢!

这意味着已经在ObjectContext上调用了Dispose()。 关于为什么会发生这种情况有很多不同的原因,但它归结为在Application_EndRequest之前调用Dispose()的事实。 没有所有的来源,就不可能确切地说出原因。

因为你要求建议,我的第一个是从HttpContext中取出ObjectContext。 数据库连接应该只存在很短的时间,并执行特定的任务。 如果它是短暂的,您可以将ObjectContext放在using语句中,该语句将自动为您调用Dispose()。

假设您有一个为您提供当前ObjectContext的类,那么程序员可能会根据博客中的一些示例或类似内容编写此代码:

using(var context = ContextProvider.GetCurrentContext()){
    ...
}

并在请求结束之前处理了ObjectContext。

如果要测试ObjectContext的处置位置,可以执行以下操作:

在ObjectContext实现中,将Dispose方法更改为:

public override void Dispose() {
    throw new InvalidOpearationException("Gotcha!");
}

public void ActuallyDisposePlease() {
    base.Dispose();
}

并在Application_EndRequest中调用ActuallyDisposePlease()方法。

当然,这是用于测试/调试/诊断的角度,并且永远不应该投入生产。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM