存储库上的Ninject WCF垃圾收集

May*_*ayo 3 c# wcf garbage-collection ninject

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

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

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

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

这是我的Ninject绑定:

Bind<ISomeRepository>().To<SomeRepository>().InRequestScope();
Run Code Online (Sandbox Code Playgroud)

这是我的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>
Run Code Online (Sandbox Code Playgroud)

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

Aar*_*ght 6

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

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

在WCF中与此最接近的类比是OperationScope.你可以使用绑定

Bind(...).To(...).InScope(() => OperationContext.Current)
Run Code Online (Sandbox Code Playgroud)

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

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