Clonare e manipolare Message in WCF

di Cristian Civera, in Windows Communication Foundation,

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.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi