我在服务应用程序中有一个ServiceHost,它每60秒与1700个客户端通信一次。当我启动该服务时,它几乎立即攀升至约1500个打开的手柄,然后在约5分钟后继续添加另外300个手柄(并在此后连续不断地继续。)
我看过ProcessExplorer,在“拆分”视图中,它显示了数百个文件类型为“ Device \ Afd”的句柄-这是用于通信的TCP套接字的代表(我相信)。
我仅假设我的句柄泄漏与ServiceHost有关,因为它表示从Process Explorer中观察到的最大句柄数。我想知道的是为什么服务没有关闭这些服务?我是否需要设置某种超时时间,还是需要自己在某个地方主动将其关闭?
这是我的ServiceHost的创建方式:
wcfObject = new WcfObject();
host = new ServiceHost(wcfObject, baseWcfAddress);
ServiceBehaviorAttribute attribute = (ServiceBehaviorAttribute)host.Description.Behaviors[typeof(ServiceBehaviorAttribute)];
attribute.ConcurrencyMode = ConcurrencyMode.Multiple;
attribute.InstanceContextMode = InstanceContextMode.Single;
在我的app.config中:
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<services>
<service name="WcfObject" behaviorConfiguration="DefaultBehavior">
<host>
<baseAddresses >
<!-- Defined in code -->
</baseAddresses>
</host>
<endpoint name="NetTcpEndPoint" address="" binding="netTcpBinding" bindingConfiguration="netTcpBinding" contract="IWcfObject"/>
<endpoint name="NetTcpMetadataPoint" address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
</service>
</services>
<bindings>
<netTcpBinding>
<binding name="netTcpBinding" maxReceivedMessageSize="9655360" maxBufferSize="9655360" maxBufferPoolSize="524288">
<readerQuotas maxArrayLength = "932000" maxStringContentLength="900000" maxDepth="32"/>
<security mode="None"></security>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="DefaultBehavior" >
<serviceMetadata httpGetEnabled="False" httpGetUrl="" />
<serviceDebug includeExceptionDetailInFaults="True"/>
<serviceThrottling maxConcurrentCalls="50" maxConcurrentSessions="100" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
最佳答案
我认为您的具体问题在here中进行了描述。
创建通道并存在操作上下文后,则
每个新的频道实例都附加在WmiChannels列表中(请参见
实例代码中的InstanceContext.WmiChannels属性)。此列表导致
泄漏。但是,如果在每次调用时都重新创建InstanceContext
操作(即在PerCall上设置InstanceContextMode时),
列表将被重新创建,不会造成泄漏。
有关解决方法,请参阅同一篇文章。请随时将您的发现告知我们。
关于wcf - 我的ServiceHost中的内存和处理泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7613752/