首页 / 软件开发 / WCF / 《WCF技术内幕》30:第2部分_第5章_消息:复制消息、消息清理和本章小结
《WCF技术内幕》30:第2部分_第5章_消息:复制消息、消息清理和本章小结2011-06-20 博客园 Frank Xu Lei译复制消息有时候需要从现有的一个消息实例创建一个缓存模式的消息拷贝。Message类 型定义了实现此目的的实例方法:public MessageBuffer CreateBufferedCopy(Int32 maxBufferSize) { ... }
创建Message的拷贝还是相当简单的,但是这会带来消息内部状态的改变。如 果使用不当,这个状态改变会给我们要复制的消息对象带来一些问题。当调用 CreateBufferedCopy方法时,新消息的state属性必须是MessageState.Created 。如果设置为其它状态,此方法就会抛出一个InvalidOperationException异常 。直到CreateBufferedCopy返回结果,原调用实例的状态才会变为 MessageState.Copied。如果此方法调用成功,则会返回一个 System.ServiceModel. Channels.MessageBuffer类型的实例。MessageBuffer定 义了一个实例方法CreateMessage,它会返回一个Message类型实例。这个实例的 状态会是Message.Created。下面代码演示了如何复制一个消息:Message msg = Message.CreateMessage (MessageVersion.Default,"urn:SomeAction","Something in the body");
Console.WriteLine("Starting Message state: {0}
", msg.State);
Console.WriteLine("Message:
{0}
", msg.ToString());
MessageBuffer buffer = msg.CreateBufferedCopy (Int32.MaxValue);
Console.WriteLine("Message state after copy: {0}
", msg.State);
Message msgNew = buffer.CreateMessage();
Console.WriteLine("New Message State: {0}
",msgNew.State);
Console.WriteLine("New Message:
{0}
", msgNew.ToString ());
运行代码,输入结果如下:Starting Message state: CreatedMessage:<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing"
xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<a:Action s:mustUnderstand="1">urn:SomeAction</a:Action>
</s:Header>
<s:Body>
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
Something in the body</string>
</s:Body>
</s:Envelope>