public async static Task WriteMessageAsync(Message message, IConnection connection, bool isRequest, IConnectionOrientedTransportFactorySettings settings, TimeoutHelper timeoutHelper) { byte[] endBytes = null; if (message != null) { MessageEncoder messageEncoder = settings.MessageEncoderFactory.Encoder; byte[] envelopeStartBytes = SingletonEncoder.EnvelopeStartBytes; bool writeStreamed; if (isRequest) { endBytes = SingletonEncoder.EnvelopeEndFramingEndBytes; writeStreamed = TransferModeHelper.IsRequestStreamed(settings.TransferMode); } else { endBytes = SingletonEncoder.EnvelopeEndBytes; writeStreamed = TransferModeHelper.IsResponseStreamed(settings.TransferMode); } if (writeStreamed) { await connection.WriteAsync(envelopeStartBytes, 0, envelopeStartBytes.Length, false, timeoutHelper.RemainingTime()); Stream connectionStream = new StreamingOutputConnectionStream(connection, settings); Stream writeTimeoutStream = new TimeoutStream(connectionStream, timeoutHelper.RemainingTime()); await messageEncoder.WriteMessageAsync(message, writeTimeoutStream); } else { ArraySegment <byte> messageData = await messageEncoder.WriteMessageAsync(message, int.MaxValue, settings.BufferManager, envelopeStartBytes.Length + IntEncoder.MaxEncodedSize); messageData = SingletonEncoder.EncodeMessageFrame(messageData); Buffer.BlockCopy(envelopeStartBytes, 0, messageData.Array, messageData.Offset - envelopeStartBytes.Length, envelopeStartBytes.Length); await connection.WriteAsync(messageData.Array, messageData.Offset - envelopeStartBytes.Length, messageData.Count + envelopeStartBytes.Length, true, timeoutHelper.RemainingTime()); } } else if (isRequest) // context handles response end bytes { endBytes = SingletonEncoder.EndBytes; } if (endBytes != null && endBytes.Length > 0) { await connection.WriteAsync(endBytes, 0, endBytes.Length, true, timeoutHelper.RemainingTime()); } }
public static void WriteMessage(Message message, IConnection connection, bool isRequest, IConnectionOrientedTransportFactorySettings settings, ref TimeoutHelper timeoutHelper) { byte[] envelopeEndFramingEndBytes = null; if (message != null) { bool flag; MessageEncoder encoder = settings.MessageEncoderFactory.Encoder; byte[] envelopeStartBytes = SingletonEncoder.EnvelopeStartBytes; if (isRequest) { envelopeEndFramingEndBytes = SingletonEncoder.EnvelopeEndFramingEndBytes; flag = TransferModeHelper.IsRequestStreamed(settings.TransferMode); } else { envelopeEndFramingEndBytes = SingletonEncoder.EnvelopeEndBytes; flag = TransferModeHelper.IsResponseStreamed(settings.TransferMode); } if (flag) { connection.Write(envelopeStartBytes, 0, envelopeStartBytes.Length, false, timeoutHelper.RemainingTime()); Stream stream = new StreamingOutputConnectionStream(connection, settings); Stream stream2 = new TimeoutStream(stream, ref timeoutHelper); encoder.WriteMessage(message, stream2); } else { ArraySegment <byte> segment = SingletonEncoder.EncodeMessageFrame(encoder.WriteMessage(message, 0x7fffffff, settings.BufferManager, envelopeStartBytes.Length + 5)); Buffer.BlockCopy(envelopeStartBytes, 0, segment.Array, segment.Offset - envelopeStartBytes.Length, envelopeStartBytes.Length); connection.Write(segment.Array, segment.Offset - envelopeStartBytes.Length, segment.Count + envelopeStartBytes.Length, true, timeoutHelper.RemainingTime(), settings.BufferManager); } } else if (isRequest) { envelopeEndFramingEndBytes = SingletonEncoder.EndBytes; } if (envelopeEndFramingEndBytes != null) { connection.Write(envelopeEndFramingEndBytes, 0, envelopeEndFramingEndBytes.Length, true, timeoutHelper.RemainingTime()); } }
public WriteMessageAsyncResult(Message message, IConnection connection, bool isRequest, IConnectionOrientedTransportFactorySettings settings, ref TimeoutHelper timeoutHelper, AsyncCallback callback, object state) : base(callback, state) { this.connection = connection; this.encoder = settings.MessageEncoderFactory.Encoder; this.bufferManager = settings.BufferManager; this.timeoutHelper = timeoutHelper; this.message = message; this.settings = settings; bool flag = true; bool flag2 = false; if (message == null) { if (isRequest) { this.endBytes = SingletonEncoder.EndBytes; } flag2 = this.WriteEndBytes(); } else { try { bool flag3; byte[] envelopeStartBytes = SingletonEncoder.EnvelopeStartBytes; if (isRequest) { this.endBytes = SingletonEncoder.EnvelopeEndFramingEndBytes; flag3 = TransferModeHelper.IsRequestStreamed(settings.TransferMode); } else { this.endBytes = SingletonEncoder.EnvelopeEndBytes; flag3 = TransferModeHelper.IsResponseStreamed(settings.TransferMode); } if (flag3) { if (onWriteStartBytes == null) { onWriteStartBytes = Fx.ThunkCallback(new AsyncCallback(StreamingConnectionHelper.WriteMessageAsyncResult.OnWriteStartBytes)); } IAsyncResult result = connection.BeginWrite(envelopeStartBytes, 0, envelopeStartBytes.Length, true, timeoutHelper.RemainingTime(), onWriteStartBytes, this); if (result.CompletedSynchronously) { if (onWriteStartBytesScheduled == null) { onWriteStartBytesScheduled = new Action <object>(StreamingConnectionHelper.WriteMessageAsyncResult.OnWriteStartBytesScheduled); } ActionItem.Schedule(onWriteStartBytesScheduled, result); } } else { ArraySegment <byte> segment = SingletonEncoder.EncodeMessageFrame(settings.MessageEncoderFactory.Encoder.WriteMessage(message, 0x7fffffff, this.bufferManager, envelopeStartBytes.Length + 5)); this.bufferToFree = segment.Array; Buffer.BlockCopy(envelopeStartBytes, 0, segment.Array, segment.Offset - envelopeStartBytes.Length, envelopeStartBytes.Length); if (onWriteBufferedMessage == null) { onWriteBufferedMessage = Fx.ThunkCallback(new AsyncCallback(StreamingConnectionHelper.WriteMessageAsyncResult.OnWriteBufferedMessage)); } IAsyncResult result2 = connection.BeginWrite(segment.Array, segment.Offset - envelopeStartBytes.Length, segment.Count + envelopeStartBytes.Length, true, timeoutHelper.RemainingTime(), onWriteBufferedMessage, this); if (result2.CompletedSynchronously) { flag2 = this.HandleWriteBufferedMessage(result2); } } flag = false; } finally { if (flag) { this.Cleanup(); } } } if (flag2) { base.Complete(true); } }