我正在使用带有WCF扩展的Ninject 2.2。在我的大多数服务中,存储库都会快速实例化/释放。但是,我的一项服务执行长时间运行(2-3分钟)。如果我观察w3wp进程,我可以看到使用SQL建立的TCP / IP连接,我可以在SQL上运行sp_who2并查看连接。
完成这些操作后,连接将保持打开状态5-10分钟。
当我多次运行该操作时,我没有看到生成新的连接但是我将运行该应用程序的多个实例,并且我发现之前的性能下降,同时发送了那些长时间运行的操作并且在几分钟后自行修复。
此垃圾收集是否可以成为问题的一部分?如何解决?
这是我的Ninject绑定:
Bind<ISomeRepository>().To<SomeRepository>().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>
我意识到一个选择是将服务使用的存储库数量减少到一个,但我真的在寻找一个临时解决方案。
答案 0 :(得分:6)
InRequestScope
在WCF 中没有任何功能,除非您在IIS compatibility mode中托管。这不是默认模式,也不建议用于大多数用途。
尝试此操作时实际会发生的是Ninject将使用null
范围,这相当于根本没有指定任何范围。这反过来导致标准的cache and collect行为,这意味着Ninject将处理这些连接(从而将它们释放回连接池),只要感觉如此,就用非常简单的术语来说明。
在WCF中与此最接近的模拟是OperationScope
。您可以使用
Bind(...).To(...).InScope(() => OperationContext.Current)
这曾经是一个半生不熟的解决方案,但我认为它现在应该可以正常工作,因为NinjectServiceHostFactory
添加了一个服务行为,当“请求”(即操作)是时,它会自动通知缓存结束了。
这个支持最近被添加到官方扩展中,我想最近在2011年3月,所以请确保你使用的是最新版本。在撰写本文时,这是2.3.0.0。