内存不足WCF调用

时间:2015-09-28 08:08:22

标签: c# wcf

我们的服务器在生产环境中运行,但在运行几天后,WCF调用会发生内存不足。

Line 36007:    GlobalUnhandledException: System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
Line 36063:    at System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(SocketError socketError, Int32 bytesTransferred, SocketFlags flags)
Line 36063:    at System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(SocketError socketError, Int32 bytesTransferred, SocketFlags flags)
Line 36064:    at System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
Line 36065:    at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

我们尝试在配置中提供最大数组大小。在服务器端绑定WCF的配置。

<netTcpBinding>
    <binding maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferPoolSize="524288" sendTimeout="00:00:35" transactionFlow="true"  >
      <reliableSession enabled="true" />
      <security mode="None" />
    </binding>
  </netTcpBinding>

WCF连接调用是否存在内存泄漏问题?

服务行为:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,
                 ConcurrencyMode = ConcurrencyMode.Multiple,
                 ReleaseServiceInstanceOnTransactionComplete = false)]

我是否在配置过程中遗漏了一些内容,纠正或识别此内存异常的步骤是什么,我们非常感谢您对此事的任何帮助。

更新: 运营合同:

[OperationContract]
    [TransactionFlow(TransactionFlowOption.Allowed)]

1 个答案:

答案 0 :(得分:2)

是的,您的配置就是问题。

这就是您的配置意味着:

InstanceContextMode = InstanceContextMode.PerCall - 为每次对服务的调用启动一个新的服务实例。

ConcurrencyMode = ConcurrencyMode.Multiple - 允许多个线程在服务实例中启动

ReleaseServiceInstanceOnTransactionComplete = false - 调用完成后不要释放服务实例。

修改

根据方法的OperationContract,我会为方法指定OperationBehaviour,并根据您的需要配置交易完成行为。

MSDN for ReleaseInstanceOnTransaction - 有一个很好的例子说明OperationBehaviour应该如何配置为在基础操作完成后自动完成事务。

OutOfMemoryException的根本原因很可能是没有完成事务,因此不会导致WCF ServiceInstance被关闭和垃圾回收。