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;
		}
Esempio n. 2
0
        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);
                }
            }
        }
Esempio n. 3
0
 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;
 }