我们有一个用C#(.NET Framework 2.0)编写的WCF客户端/服务器应用程序。我们的WCF堆栈的一部分是GZipMessageEncoder。有时,我们的应用程序中的报告会请求大量数据。这会导致GZipMessageEncoder中的错误:
System.InsufficientMemoryException: Failed to allocate a managed memory buffer of 268435456 bytes. The amount of available memory may be low.
---> System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.ServiceModel.Diagnostics.Utility.AllocateByteArray(Int32 size)
--- End of inner exception stack trace ---
at System.ServiceModel.Diagnostics.Utility.AllocateByteArray(Int32 size)
at System.ServiceModel.Channels.BufferManager.PooledBufferManager.TakeBuffer(Int32 bufferSize)
at System.ServiceModel.Channels.BufferedOutputStream.Init(Int32 initialSize, Int32 maxSizeQuota, Int32 effectiveMaxSize, BufferManager bufferManager)
at System.ServiceModel.Channels.BufferedMessageWriter.WriteMessage(Message message, BufferManager bufferManager, Int32 initialOffset, Int32 maxSizeQuota)
at System.ServiceModel.Channels.BinaryMessageEncoderFactory.BinaryMessageEncoder.WriteMessage(Message message, Int32 maxMessageSize, BufferManager bufferManager, Int32 messageOffset)
at profdata.com.Library.GZipMessageEncoderFactory.GZipMessageEncoder.WriteMessage(Message message, Int32 maxMessageSize, BufferManager bufferManager, Int32 messageOffset)
我已更改GZipMessageEncoder以将此消息记录到Windows事件日志中,以便支持人员可以跟踪错误发生的时间:
Web服务没有足够的内存来响应请求。 连接将关闭,客户端可能会收到错误 “现有连接被远程主机强行关闭。”
我想在事件日志消息中包含报告名称和参数。不幸的是,我在WCF Message类本身没有足够的信息来确定错误是什么。请求信息实际上是正文中包含报告名称和参数的小型DataSet。
我认为如果我可以将一些非序列化数据附加到Message上会很好。在GZipMessageEncoder中,当发生此错误时,我可以剥离此数据并记录报告名称和参数。
如何从WCF编码器内部记录消息正文中的信息?我是否需要在线程本地存储中保留报告信息对象?或者是Message-to-report信息对象的静态字典?