我在服务应用程序中有一个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/

10-13 07:09