C# 存储库上的Ninject WCF垃圾回收

C# 存储库上的Ninject WCF垃圾回收,c#,wcf,garbage-collection,ninject,C#,Wcf,Garbage Collection,Ninject,我正在使用Ninject 2.2和WCF扩展。在我的大多数服务上,存储库都是快速实例化/发布的。但是,我的一个服务执行长时间运行的操作(2-3分钟)。如果我观察w3wp进程,我可以看到TCP/IP连接是用SQL建立的,我可以在SQL上运行sp_who2并查看连接 这些操作完成后,连接将保持打开状态5-10分钟 当我多次运行该操作时,我没有看到新的连接产生,但我将有多个应用程序实例在运行,我以前在垃圾邮件发送那些长时间运行的操作时看到性能下降,几分钟后它自行修复 此垃圾收集是否是问题的一部分,以及

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

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

当我多次运行该操作时,我没有看到新的连接产生,但我将有多个应用程序实例在运行,我以前在垃圾邮件发送那些长时间运行的操作时看到性能下降,几分钟后它自行修复

此垃圾收集是否是问题的一部分,以及如何解决此问题?

这是我的九件装:

Bind<ISomeRepository>().To<SomeRepository>().InRequestScope();
Bind().To().InRequestScope();
以下是我的WCF绑定:

<binding name="xxx" closeTimeout="00:01:00"
  openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
  bypassProxyOnLocal="false" transactionFlow="false" 
  hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" 
  maxReceivedMessageSize="99999999" messageEncoding="Text"
  textEncoding="utf-8" useDefaultWebProxy="false" allowCookies="false">
  <readerQuotas maxDepth="90" maxStringContentLength="99999" 
    maxArrayLength="99999999" maxBytesPerRead="4096" 
    maxNameTableCharCount="16384" />
  <reliableSession ordered="true" inactivityTimeout="00:10:00"
    enabled="true" />
  <security mode="..."/>
</binding>

<service name="SomeService" 
  behaviorConfiguration="abcd">
  <endpoint name="BasicEndPoint" address="http://localhost/SomeService.svc" 
    binding="wsHttpBinding" bindingConfiguration="xxx"
    contract="ISomeJobService"/>
  <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>


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

InRequestScope
在WCF中没有任何功能,除非您在中托管。这不是默认模式,在大多数情况下也不建议使用该模式

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

在WCF中与此最接近的模拟是
操作范围
。您可以使用

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


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

在ninject标签中查找关于这一点的最新帖子-WCF扩展并不像ASP.NET管道集成那样确定地处理每个请求的内容,但2.3中的内容应该变成2.4。感谢您提供的信息-如果我可以多次投票,我会的。你是从源代码中学到这一点的,还是在某个地方有关于这一主题的文章?@Mayo:很久以前我写了自己的OperationScope扩展,并决定在发布之前检查Ninject.Extensions.Wcf源代码,从中我得到了主库(显然)支持它的信息。遗憾的是,关于Ninject扩展的文档非常少。这是否仍然是WCF调用中对象(例如repo)生命周期内的“完成的事情”?@Mike:InRequestScope中的
InRequestScope
扩展现在是
Ninject.Web.Common
中基于插件的方法,因此它应该在IIS托管的WCF服务中工作。如果你是自我托管,我不完全确定;试试看。