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
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
- Eseguire una chiamata AJAX per inviare dati al server in Angular 2
- Formati per l'impostazione del colore in CSS3
- la Call For Papert per #netconfit è aperta!invia la tua sessione da https://aspit.co/netconfit-20 puoi parlare di #net5, #aspnet5, #efcore5, #CSharp9 e tutto quello che ruota intorno a #dotnet.
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Impostare un riferimento ad una entity collegata tramite foreign key