偶尔会出现以下异常:"ObjectContext实例已被释放,不能再用于需要连接的操作"。
这种例外情况的再现是不稳定的,而且很难捕捉到。
通常,当浏览器同时发送两个或多个请求时,我会遇到这种异常。
使用了一个集成测试同时运行数百个线程具有DbContext的唯一实例和模型方法的后续执行。尽管如此,这次测试没有抛出任何异常并通过了测试。
在向Db:发出的第一个请求时引发异常
public IForumCategory GetCategoryById(int id)
{
return Repository.ForumCategories.FirstOrDefault(a => a.Id == id);
}
LazyLoading已被禁用,并且未使用导航属性。"包含"也不使用,而是由"联接"代替。
处理DbContext:
public abstract class WebApiDependencyScope<TModelFactory> : IDependencyScope where TModelFactory : ModelFactory
{
...
public virtual void Dispose()
{
ModelFactory.Dispose();
}
...
}
DbContext随后由ModelFactory处理,因此不能将其视为早期的DbContext处理
更新信息:AspNet WebApi Framework根据请求创建的DbContext:
public override IDependencyScope BeginScope()
{
ISiteRepositoryFactory repositoryFactory = new SiteAspNetRepositoryFactory(Config);
GameModelFactory factory = new GameModelFactory(
repositoryFactory, LocaleProvider, Config, Authenticate);
Scope = new GameWebApiDependencyScope(factory);
return Scope;
}
解决方案
直到最后我才明白,但也许。。。
发生了什么:每次我创建子作用域并将其分配给根作用域时。但当请求结束时,每个子作用域都在处理。通过这种方式,根作用域此时可以释放作用域,当它尝试从该作用域创建服务时,我会遇到此异常。
我不知道根作用域是如何以及为什么抛出这个特殊的异常的。
现在BeginScope看起来:
public override IDependencyScope BeginScope()
{
ISiteRepositoryFactory repositoryFactory = new SiteAspNetRepositoryFactory(Config);
GameModelFactory factory = new GameModelFactory(
repositoryFactory, LocaleProvider, Config, Authenticate);
return new GameWebApiDependencyScope(factory);
}
根作用域是在Resolver构造函数中初始化的。我可能已经解决了这个问题,但这并不完全是,因为异常是不稳定的。