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);
 }
Example #3
0
            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;
            }
Example #4
0
 private void ReturnMessageWriter(BinaryBufferedMessageWriter messageWriter)
 {
     _bufferedWriterPool.Return(messageWriter);
 }
Example #5
0
        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;
 }