存储库上的Ninject WCF垃圾收集

我正在使用带有WCF扩展的Ninject 2.2。 在我的大多数服务中,存储库都会快速实例化/释放。 但是,我的一项服务执行长时间运行(2-3分钟)。 如果我观察w3wp进程,我可以看到使用SQL建立的TCP / IP连接,我可以在SQL上运行sp_who2并查看连接。

完成这些操作后,连接将保持打开状态5-10分钟。

当我多次运行该操作时,我没有看到生成新的连接,但是我将运行该应用程序的多个实例,并且我发现之前的性能下降,同时发送了那些长时间运行的操作,并且在几分钟后自行修复。

这个垃圾收集可以成为问题的一部分吗?如何解决?

这是我的Ninject绑定:

Bind().To().InRequestScope(); 

这是我的WCF绑定:

          

我意识到一个选择是将服务使用的存储库数量减少到一个,但我真的在寻找一个临时解决方案。

除非您在IIS兼容模式下托管, 否则 InRequestScope在WCF中没有任何function。 这不是默认模式,也不建议用于大多数目的。

当您尝试这样做时实际会发生的是Ninject将使用null范围,这相当于根本不指定任何范围。 这反过来会导致标准缓存和收集行为,这意味着无论何时感觉它都会处理这些连接(从而将它们释放回连接池),以非常简单的方式陈述它。

在WCF中最接近它的是OperationScope 。 你可以使用绑定

 Bind(...).To(...).InScope(() => OperationContext.Current) 

这曾经是一个半生不熟的解决方案,但我认为它现在应该正常工作,因为NinjectServiceHostFactory添加了一个服务行为,当“请求”(即操作)结束时,该行为会自动通知缓存。

这个支持最近被添加到官方扩展中,我想最近在2011年3月,所以请确保你使用的是最新版本。 在撰写本文时,这是2.3.0.0。