在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)]
是的,你的配置是问题。
这是你的配置的意思:
InstanceContextMode = InstanceContextMode.PerCall
-为每个对服务的调用启动一个新的服务实例。
ConcurrencyMode = ConcurrencyMode.Multiple
-允许多个线程在服务实例中启动
ReleaseServiceInstanceOnTransactionComplete = false
—呼叫结束后不释放业务实例
根据方法的OperationContract
,我将为该方法指定OperationBehaviour
,并根据您的需要配置事务完成行为。
MSDN for ReleaseInstanceOnTransaction -有一个很好的例子,说明OperationBehaviour
应该如何配置为一旦底层操作完成就自动完成Transaction。
OutOfMemoryException
的根本原因很可能是没有完成事务,因此没有导致WCF ServiceInstance
关闭和垃圾收集。