[WCF] Copiare un messaggio
Lavorando con WCF prima o poi capita di utilizzare la classe Message. La classe è la rappresentazione in memoria del messaggio inviato dal client WCF oppure ricevuto dal servizio WCF. Possiamo interagire con la classe Message per recuperare i suoi headers oppure per ispezionarne il body. Però, mentre gli headers possono essere utilizzati più di una volta, non possiamo accedere al body se questo è stato già letto.
La classe gestisce, internamente, un set di stati:
- Created
- Read
- Written
- Copied
- Closed
Se proviamo a leggere il contenuto (body) di un messaggio per due volte, ad esempio:
person1 = message.GetBody<Person>();
...
person2 = message.GetBody<Person>();
la seconda riceveremo un bel:
This message cannot support the operation because it has been read.
dopo la prima lettura, infatti, lo stato del messaggio diventa Read. Sfruttando, invece, la possibilità di creare una copia buffer del messaggio possiamo copiare il messaggio originale ed ottenere quindi una o più copie "riutilizzabili" del messaggio:
Message originalMessage =
Message.CreateMessage(MessageVersion.Default,
"http://tempuri.org/MyService", new Person { Name = "Fabio" });
Console.WriteLine("OriginalMessage: " + originalMessage.State);
MessageBuffer messageBuffer = originalMessage.CreateBufferedCopy(int.MaxValue);
Console.WriteLine("OriginalMessage: " + originalMessage.State);
Message messageCopy1 = messageBuffer.CreateMessage();
Console.WriteLine("MessageCopy1: " + messageCopy1.State);
Message messageCopy2 = messageBuffer.CreateMessage();
Console.WriteLine("MessageCopy2: " + messageCopy2.State);
messageBuffer.Close();
l'output in console genera:
Il messaggio originale da creato, passa a copiato dopo la chiamata alla CreateBufferedCopy. Le copie, infine, hanno entrambe Created come stato e sono quindi riutilizzabili.
bye