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)
我意识到一个选择是将服务使用的存储库数量减少到一个,但我真的在寻找一个临时解决方案.
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.