private BinaryBufferedMessageWriter TakeBufferedWriter() { if (this.bufferedWriterPool == null) { lock (this.ThisLock) { if (this.bufferedWriterPool == null) { this.bufferedWriterPool = new SynchronizedPool <BinaryBufferedMessageWriter>(this.maxWritePoolSize); } } } BinaryBufferedMessageWriter writer = this.bufferedWriterPool.Take(); if (writer == null) { writer = new BinaryBufferedMessageWriter(this.binaryVersion.Dictionary); } return(writer); }
private void ReturnMessageWriter(BinaryBufferedMessageWriter messageWriter) { this.bufferedWriterPool.Return(messageWriter); }
public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset) { if (message == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("message"); } if (bufferManager == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("bufferManager"); } if (maxMessageSize < 0) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("maxMessageSize", maxMessageSize, SR.ValueMustBeNonNegative)); } EventTraceActivity eventTraceActivity = null; if (WcfEventSource.Instance.BinaryMessageEncodingStartIsEnabled()) { eventTraceActivity = EventTraceActivityHelper.TryExtractActivity(message); WcfEventSource.Instance.BinaryMessageEncodingStart(eventTraceActivity); } message.Properties.Encoder = this; if (_isSession) { if (_writerSession == null) { _writerSession = new XmlBinaryWriterSessionWithQuota(_maxSessionSize); _sessionMessageWriter = new BinaryBufferedMessageWriter(_factory._binaryVersion.Dictionary, _writerSession); } messageOffset += IntEncoder.MaxEncodedSize; } if (messageOffset < 0) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("messageOffset", messageOffset, SR.ValueMustBeNonNegative)); } if (messageOffset > maxMessageSize) { string excMsg = SR.Format(SR.MaxSentMessageSizeExceeded, maxMessageSize); if (WcfEventSource.Instance.MaxSentMessageSizeExceededIsEnabled()) { WcfEventSource.Instance.MaxSentMessageSizeExceeded(excMsg); } throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new QuotaExceededException(excMsg)); } ThrowIfMismatchedMessageVersion(message); BinaryBufferedMessageWriter messageWriter; if (_isSession) { messageWriter = _sessionMessageWriter; } else { messageWriter = _factory.TakeBufferedWriter(); } ArraySegment<byte> messageData = messageWriter.WriteMessage(message, bufferManager, messageOffset, maxMessageSize); if (MessageLogger.LogMessagesAtTransportLevel && !_readerSessionForLoggingIsInvalid) { if (_isSession) { if (_readerSessionForLogging == null) { _readerSessionForLogging = new XmlBinaryReaderSession(); } if (_writerSession.HasNewStrings) { foreach (XmlDictionaryString xmlDictionaryString in _writerSession.GetNewStrings()) { _readerSessionForLogging.Add(_writeIdCounter++, xmlDictionaryString.Value); } } } XmlDictionaryReader xmlDictionaryReader = XmlDictionaryReader.CreateBinaryReader(messageData.Array, messageData.Offset, messageData.Count, XD.Dictionary, XmlDictionaryReaderQuotas.Max, _readerSessionForLogging); MessageLogger.LogMessage(ref message, xmlDictionaryReader, MessageLoggingSource.TransportSend); } else { _readerSessionForLoggingIsInvalid = true; } if (_isSession) { messageData = AddSessionInformationToMessage(messageData, bufferManager, maxMessageSize); } else { _factory.ReturnMessageWriter(messageWriter); } CompressionFormat compressionFormat = this.CheckCompressedWrite(message); if (compressionFormat != CompressionFormat.None) { MessageEncoderCompressionHandler.CompressBuffer(ref messageData, bufferManager, compressionFormat); } return messageData; }
private void ReturnMessageWriter(BinaryBufferedMessageWriter messageWriter) { _bufferedWriterPool.Return(messageWriter); }
private BinaryBufferedMessageWriter TakeBufferedWriter() { if (_bufferedWriterPool == null) { lock (ThisLock) { if (_bufferedWriterPool == null) { //running = true; _bufferedWriterPool = new SynchronizedPool<BinaryBufferedMessageWriter>(_maxWritePoolSize); } } } BinaryBufferedMessageWriter messageWriter = _bufferedWriterPool.Take(); if (messageWriter == null) { messageWriter = new BinaryBufferedMessageWriter(_binaryVersion.Dictionary); if (WcfEventSource.Instance.WritePoolMissIsEnabled()) { WcfEventSource.Instance.WritePoolMiss(messageWriter.GetType().Name); } } return messageWriter; }
BinaryBufferedMessageWriter TakeBufferedWriter() { if (bufferedWriterPool == null) { lock (ThisLock) { if (bufferedWriterPool == null) { //running = true; bufferedWriterPool = new SynchronizedPool<BinaryBufferedMessageWriter>(maxWritePoolSize); } } } BinaryBufferedMessageWriter messageWriter = bufferedWriterPool.Take(); if (messageWriter == null) { messageWriter = new BinaryBufferedMessageWriter(binaryVersion.Dictionary); if (TD.WritePoolMissIsEnabled()) { TD.WritePoolMiss(messageWriter.GetType().Name); } } return messageWriter; }
private BinaryBufferedMessageWriter TakeBufferedWriter() { if (this.bufferedWriterPool == null) { lock (this.ThisLock) { if (this.bufferedWriterPool == null) { this.bufferedWriterPool = new SynchronizedPool<BinaryBufferedMessageWriter>(this.maxWritePoolSize); } } } BinaryBufferedMessageWriter writer = this.bufferedWriterPool.Take(); if (writer == null) { writer = new BinaryBufferedMessageWriter(this.binaryVersion.Dictionary); } return writer; }