private ChunkingMessage GetNewChunkingMessage(Message receivedMessage, TimeoutHelper timeoutHelper) { if (receivedMessage == null) { return null; } Guid messageId = this.GetMessageId(receivedMessage); if (this.currentInputMessage != null && messageId == this.currentInputMessage.MessageId) { throw new InvalidOperationException("A new ChunkingMessage was requested but the received message's id matches the current message id. The received message is a chunk of the current message"); } ChunkingReader reader = new ChunkingReader(receivedMessage, this.maxBufferedChunks, timeoutHelper); string header = receivedMessage.Headers.GetHeader<string>("OriginalAction", "http://bam.nexon.com/chunking"); ChunkingMessage chunkingMessage = new ChunkingMessage(receivedMessage.Version, header, reader, messageId); string addressingNamespace = ChunkingUtils.GetAddressingNamespace(receivedMessage.Version); for (int i = 0; i < receivedMessage.Headers.Count; i++) { MessageHeaderInfo messageHeaderInfo = receivedMessage.Headers[i]; if (messageHeaderInfo.Namespace != "http://bam.nexon.com/chunking" && (!(messageHeaderInfo.Name == "Action") || !(messageHeaderInfo.Namespace == addressingNamespace))) { chunkingMessage.Headers.CopyHeaderFrom(receivedMessage.Headers, i); } } return chunkingMessage; }
private void SetStartMessageHeaders(Message message, Message chunk) { this.messageId = Guid.NewGuid(); this.messageIdHeader = MessageHeader.CreateHeader("MessageId", "http://bam.nexon.com/chunking", this.messageId.ToString(), true); chunk.Headers.Add(this.messageIdHeader); MessageHeader header = MessageHeader.CreateHeader("ChunkingStart", "http://bam.nexon.com/chunking", null, true); chunk.Headers.Add(header); MessageHeaders headers = message.Headers; string addressingNamespace = ChunkingUtils.GetAddressingNamespace(message.Version); for (int i = 0; i < headers.Count; i++) { if (headers[i].Name == "Action" && headers[i].Namespace == addressingNamespace) { string action = message.Headers.Action; MessageHeader header2 = MessageHeader.CreateHeader("OriginalAction", "http://bam.nexon.com/chunking", action); chunk.Headers.Add(header2); } else { chunk.Headers.CopyHeaderFrom(headers, i); } } }
internal ChunkingReader(Message startMessage, int maxBufferedChunks, TimeoutHelper receiveTimeout) { this.innerReader = startMessage.GetReaderAtBodyContents(); this.lockobject = new object(); this.messageId = ChunkingUtils.GetMessageHeader <Guid>(startMessage, "MessageId", "http://bam.nexon.com/chunking"); this.bufferedChunks = new SynchronizedQueue <Message>(maxBufferedChunks); this.receiveTimeout = receiveTimeout; this.nextChunkNum = 1; }