在WCF调用时出现内存不足异常

本文关键字:内存不足 异常 WCF 调用 | 更新日期: 2023-09-27 18:15:00

我们的服务器运行在生产环境中,但是运行了几天后,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)]

在WCF调用时出现内存不足异常

是的,你的配置是问题。

这是你的配置的意思:

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

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

ReleaseServiceInstanceOnTransactionComplete = false—呼叫结束后不释放业务实例

编辑:

根据方法的OperationContract,我将为该方法指定OperationBehaviour,并根据您的需要配置事务完成行为。

MSDN for ReleaseInstanceOnTransaction -有一个很好的例子,说明OperationBehaviour应该如何配置为一旦底层操作完成就自动完成Transaction。

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