在WCF中从CreateBufferedCopy创建2个相同副本的最佳方法是什么? 方法1或方法2以及为什么?
enter code here
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
request = buffer.CreateMessage();
//approach 1
Message message1 = buffer.CreateMessage();
Message message2 = buffer.CreateMessage();
//approach 2
Message message1 = request;
Message message2 = request;
foreach (MessageHeader h in message1 .Headers)
{
Console.WriteLine("\n{0}\n", h);
}
return null;
}
答案 0 :(得分:2)
WCF中的消息是一次性读取。这是因为它们可能是流式传输的,因此流式数据不会被神奇地重新发送
要多次“处理”一条消息,你必须复制它,复制它的唯一方法是使用方法1中的MessageBuffer。处理消息可能只是检查正文以执行数据相关的路由的内容,但一旦你要触摸正文,你必须复制它以便消息由其余的WCF基础设施成功处理
请注意,如果您只想查看标题,则不需要复制邮件,因为标题始终是缓冲的 - 它只是可能已流式传输的正文
正如@hyp所说,方法2根本没有复制消息 - 它只是给你两个对同一个消息的引用 - 可能值得重读关于引用类型和值类型的东西 - here's an article这可能有帮助
答案 1 :(得分:0)
我之前从未使用过MessageBuffer,但是方法2不会给你你想要的东西。在方法2中,您只是将请求的引用分配给两个对象,因此您仍然只有一个请求对象。换句话说,对Message1
的更改将反映在Message2
。