#161 - Clonare e manipolare Message in WCF
di Cristian Civera, in Windows Communication Foundation, 5 febbraio 2010
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.
Approfondimenti
-
La piattaforma Microsoft per il cloud computing: Windows Azure
-
#155 - Gestire e ottimizzare messaggi di grandi dimensioni in WCF
-
#133 - Una collezione avanzata per il data binding di WPF
-
Scopri i nostri nuovi libri su ASP.NET 4.0, C# 4 e Visual Basic 2010: in offerta lancio al 20% di sconto!
-
Real Code Day 4: Accesso ai dati con Entity Framework
-
#107 - Passare un Expression di Entity Framework attraverso un servizio WCF
-
Comunicazione TCP tra Silverlight e WPF
-
Button con disabilitazione dello stesso dopo il click
-
Dettagli sul metodo SelectDTO
-
#139 - Invocare servizi in asincrono con WCF
-
#149 - Personalizzare le istanze di un servizio WCF
-
#netfx4 e VS 2010 in Release Candidate, ma questa volta per tutti http://u.aspitalia.com/et

















Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.