2 идентичных сообщения из buffer.CreateMessage () в WCF правильно подходят? - PullRequest
0 голосов
/ 26 января 2012

Каков наилучший подход для создания 2 идентичных копий из CreateBufferedCopy в WCF?подход 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 ]

2 голосов
/ 26 января 2012

Сообщения в WCF читаются один раз.Это связано с тем, что они могут передаваться в потоковом режиме, и поэтому потоковые данные не будут магически повторно отправляться

Чтобы «обработать» сообщение более одного раза, необходимо скопировать его, и единственный способ скопировать его - использовать MessageBuffer каку вас есть подход 1. Обработка сообщения может быть просто проверкой тела на предмет зависимой от данных маршрутизации содержимого, но как только вы собираетесь коснуться тела, вы должны скопировать его, чтобы сообщение было успешно обработано остальной частьюИнфраструктура WCF

Обратите внимание, что если все, что вам нужно, это посмотреть на заголовки, вам не нужно копировать сообщение, так как заголовки всегда буферизуются - это только тело, которое может быть передано

как говорит @hyp, подход 2 вообще не копирует сообщение - он просто дает вам две ссылки на одно и то же сообщение - возможно, стоит перечитать кое-что о ссылочных типах и типах значений - вот статья , которая можетпомощь

0 голосов
/ 26 января 2012

Я никогда раньше не использовал MessageBuffer, но подход 2 не даст вам того, что вы ищете. В подходе 2 вы присваиваете ссылку на запрос только двум объектам, поэтому у вас остается только 1 объект запроса. Другими словами, изменения в Message1 будут отражены в Message2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...