#161 - Clonare e manipolare Message in WCF

Nello sviluppo di servizi basati su Windows Communication Foundation si possono incontrare esigenze che richiedono di poter intervenire in alcuni aspetti che riguardano lo scambio di messaggi tra consumer e service. I behavior a livello di operazione, contratto e servizio permettono di intervenire in ogni aspetto e spesso, anche nel caso di operazioni che ricevono il messaggio grezzo, le logiche che si devono implementare richiedono di leggere e manipolare il messaggio.

In WCF quest'ultimo è rappresentato dalla classe Message la quale contiene gli Headers e il Body il quale ha però una particolarità: può essere letto una sola volta. Questo perché lo State, una volta chiamato il metodo GetBody o GetReaderAtBodyContents, passa in Read non permettendo più la sua lettura. Questo comporta che ogni volta che si accede al messaggio si impedisce poi al resto della pipeline di procedere con la lettura.

Il metodo CreateBufferedCopy permette quindi di avere un oggetto che mediante buffer (la modalità predefinita di WCF) permette di ottenere navigatori XPath o creare un nuovo Message. Chiamando tale metodo però si invalida il messaggio originale, perciò solitamente quando lo si clona, occorre creare due copie: una da usare per i propri scopi e un'altra da sostituire al messaggio orinariamente passato.

Nello script seguente vengono quindi creati due messaggi, andando a sostituire byref il messaggio originale.

string SelectOperation(ref Message message) 
{ 
  // Creo una copia del messaggio offrendo il massimo spazio 
  MessageBuffer buffer = message.CreateBufferedCopy(Int32.MaxValue); 
 
  // Messaggio originale 
  message = buffer.CreateMessage(); 
 
  // Creo una copia da poter poi sfogliare 
  Message ownMessage = buffer.CreateMessage(); 
 
  using (XmlReader reader = ownMessage.GetReaderAtBodyContents()) 
  { 
    // Lettura... 
  } 
}

La clonazione e la lettura di un messaggio tramite buffer comporta però un rischio qualora i messaggi diventino di grandi dimensioni andando ad allocare troppa memoria.

IL CONTENUTO
SCRIPT VIA E-MAIL

Iscriviti alle nostre newsletter unoscript@lgiorno e Xcript per ricevere gli script via e-mail.

MEDIA
IN EVIDENZA
MISC