2个来自buffer.CreateMessage()的相同消息在WCF中的正确方法?

时间:2012-01-26 09:47:42

标签: wcf message

在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;
}

2 个答案:

答案 0 :(得分:2)

WCF中的消息是一次性读取。这是因为它们可能是流式传输的,因此流式数据不会被神奇地重新发送

要多次“处理”一条消息,你必须复制它,复制它的唯一方法是使用方法1中的MessageBuffer。处理消息可能只是检查正文以执行数据相关的路由的内容,但一旦你要触摸正文,你必须复制它以便消息由其余的WCF基础设施成功处理

请注意,如果您只想查看标题,则不需要复制邮件,因为标题始终是缓冲的 - 它只是可能已流式传输的正文

正如@hyp所说,方法2根本没有复制消息 - 它只是给你两个对同一个消息的引用 - 可能值得重读关于引用类型和值类型的东西 - here's an article这可能有帮助

答案 1 :(得分:0)

我之前从未使用过MessageBuffer,但是方法2不会给你你想要的东西。在方法2中,您只是将请求的引用分配给两个对象,因此您仍然只有一个请求对象。换句话说,对Message1的更改将反映在Message2