Condividi tramite


Trasferimento dei messaggi di flusso

I trasporti di Windows Communication Foundation (WCF) supportano due modalità di trasferimento dei messaggi:

  • Trasferimento con memorizzazione nel buffer: in questa modalità, l'intero messaggio viene memorizzato in un buffer fino al completamento del trasferimento. Un messaggio memorizzato nel buffer deve essere completamente recapitato prima che un destinatario sia in grado di leggerlo.
  • Trasferimento con flusso: in questa modalità il messaggio viene esposto come flusso. Il destinatario inizia a elaborare il messaggio prima che quest'ultimo venga recapitato per intero.
  • I trasferimenti con flusso possono migliorare la scalabilità di un servizio eliminando l'esigenza di utilizzare buffer di memoria di grandi dimensioni. La capacità di migliorare la scalabilità mediante l'impostazione della modalità di trasferimento con flusso dipende dalle dimensioni dei messaggi da trasferire. In particolare, la modalità di trasferimento con flusso risulta essere più efficiente negli scenari che prevedono messaggi di grandi dimensioni.

Per impostazione predefinita, i trasporti HTTP, TCP/IP e pipe con nome utilizzano la modalità di trasferimento con memorizzazione nel buffer. Questo documento descrive come configurare questi trasporti in modo che utilizzino la modalità di trasferimento con flusso e le relative conseguenze.

Attivazione dei trasferimenti con flusso

Per impostare una delle due modalità di trasferimento occorre intervenire sull'elemento di associazione del trasporto. L'elemento di associazione presenta una proprietà TransferMode che può essere impostata su Buffered, Streamed, StreamedRequest o StreamedResponse. L'impostazione della modalità di trasferimento su Streamed consente di attivare la comunicazione con flusso bidirezionale. L'impostazione della modalità di trasferimento su StreamedRequest o StreamedResponse consente di attivare la comunicazione con flusso soltanto nella direzione scelta.

Le associazioni BasicHttpBinding, NetTcpBinding e NetNamedPipeBinding espongono la proprietà TransferMode. Per impostare la modalità di trasferimento degli altri trasporti è necessario creare un'associazione personalizzata.

La scelta della modalità di trasferimento da utilizzare viene effettuata localmente dall'endpoint specifico. Per i trasporti HTTP, la modalità di trasferimento non si propaga attraverso una connessione, né verso server o altri intermediari. L'impostazione della modalità di trasferimento non influisce sulla descrizione dell'interfaccia del servizio. Dopo aver generato una classe client per un servizio, per impostare la modalità è necessario modificare il file di configurazione dei servizi per cui si desidera utilizzare la modalità di trasferimento con flusso. Per i trasporti TCP e pipe con nome, la modalità di trasferimento viene propagata come un'asserzione di criteri.

Per alcuni esempi di codice, vedere Procedura: attivare il flusso.

Restrizioni sui trasferimenti con flusso

L'utilizzo della modalità di trasferimento con flusso comporta l'applicazione di restrizioni aggiuntive da parte del runtime.

Le operazioni che si verificano in un trasporto con flusso possono presentare un contratto avente al massimo un solo parametro di input oppure un solo parametro output. Questo parametro corrisponde al corpo intero del messaggio e deve essere un messaggio Message, un tipo derivato dal flusso Stream oppure un'implementazione dell'interfaccia IXmlSerializable. Definire un valore restituito di un'operazione equivale a definire un parametro di output.

Alcune funzionalità di WCF, ad esempio la messaggistica affidabile, le transazioni e la protezione a livello di messaggio SOAP, utilizzano la modalità di trasferimento con memorizzazione nel buffer. L'utilizzo di queste funzionalità può ridurre o eliminare del tutto i vantaggi in termini di prestazioni ottenuti mediante i flussi. Per proteggere un trasporto con flusso, utilizzare soltanto la protezione a livello di trasporto oppure utilizzare la protezione a livello di trasporto insieme a una protezione a livello di messaggio di sola autenticazione.

Le intestazioni SOAP vengono sempre memorizzate nel buffer, anche quando si utilizza la modalità di trasferimento con flusso. Le intestazioni di un messaggio non devono superare la quota di trasporto indicata nella proprietà MaxBufferSize. Per ulteriori informazioni su questa impostazione, vedere Quote dei trasporti.

Differenze tra trasferimenti con memorizzazione nel buffer e con flusso

Il passaggio dalla modalità di trasferimento con memorizzazione nel buffer alla modalità di trasferimento con flusso comporta la modifica della forma del canale nativo dei trasporti TCP e pipe con nome. Per i trasferimenti con memorizzazione nel buffer, la forma del canale nativo è IDuplexSessionChannel. Per i trasferimenti con flusso, i canali nativi sono IRequestChannel e IReplyChannel. La modifica della modalità di trasferimento di un'applicazione esistente che utilizza questi trasporti in modo diretto (ovvero non tramite un contratto di servizio) richiede la modifica della forma del canale previsto di channel factory e listener.

Vedere anche

Attività

Procedura: attivare il flusso