TransferMode Enumerazione

Definizione

Indica se un canale utilizza modalità di trasferimento dei messaggi di richiesta e risposta con flusso o con memorizzazione nel buffer.

public enum class TransferMode
public enum TransferMode
type TransferMode = 
Public Enum TransferMode
Ereditarietà
TransferMode

Campi

Buffered 0

I messaggi di richiesta e risposta vengono entrambi memorizzati nel buffer.

Streamed 1

I messaggi di richiesta e risposta vengono entrambi inviati nel flusso.

StreamedRequest 2

Il messaggio di richiesta viene inviato nel flusso e quello di risposta viene memorizzato nel buffer.

StreamedResponse 3

Il messaggio di richiesta viene memorizzato nel buffer e quello di risposta viene inviato nel flusso.

Esempio

Nell'esempio seguente la proprietà TcpTransportBindingElement.TransferMode viene impostata su Streamed tramite codice:

TcpTransportBindingElement transport = new TcpTransportBindingElement();  
transport.TransferMode = TransferMode.Streamed;  
BinaryMessageEncodingBindingElement encoder = new BinaryMessageEncodingBindingElement();  
CustomBinding binding = new CustomBinding(encoder, transport);  

Nell'esempio seguente la proprietà TcpTransportBindingElement.TransferMode viene impostata su Streamed tramite la configurazione:

<customBinding>  
    <binding name="streamingBinding">  
        <binaryMessageEncoding />  
            <tcpTransport transferMode="Streamed" />  
     </binding>  
</customBinding>  

Commenti

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

  • Trasferimento con memorizzazione nel buffer: in questa modalità, l'intero messaggio viene memorizzato in un buffer fino al completamento del trasferimento.

  • Trasferimento con flusso: in questa modalità vengono memorizzate nel buffer solo le intestazioni dei messaggi e il corpo del messaggio viene esposto come un flusso da cui è possibile leggere parti più piccole per volta.

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 abilitare la comunicazione con flusso soltanto nella direzione scelta.

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 effettivamente la scalabilità mediante l'impostazione della modalità di trasferimento con flusso dipende di fatto dalle dimensioni dei messaggi da trasferire. I miglioramenti di scalabilità dovrebbero essere più evidenti nel caso di messaggi di grandi dimensioni che utilizzano trasferimenti con flusso anziché con memorizzazione nel buffer.

Per impostazione predefinita, i trasporti HTTP, TCP/IP e named pipe utilizzano trasferimenti di messaggi con memorizzazione nel buffer. È possibile impostare i valori di TransferMode nelle associazioni fornite NetTcpBindingdal BasicHttpBindingsistema , e NetNamedPipeBinding usando le proprietà della modalità di trasferimento esposte. La modalità può essere impostata sulla NetTcpBinding classe , ad esempio usando la NetTcpBinding.TransferMode proprietà . La modalità può inoltre essere impostata nella sezione di configurazione dell'associazione.

Per le associazioni che non espongono la proprietà relativa alla modalità di trasferimento, è possibile impostare tale modalità nell'elemento di associazione del trasporto e quindi aggiungere l'elemento a un'associazione personalizzata. Ad esempio, quando si crea un'associazione personalizzata, per impostare la modalità di trasferimento è possibile creare un elemento HttpTransportBindingElement e utilizzare la proprietà TransferMode. La modalità di trasferimento può inoltre essere impostata nella sezione di configurazione dell'associazione personalizzata.

La scelta della modalità di trasferimento da utilizzare viene effettuata localmente dall'endpoint per i trasporti HTTP. Per i trasporti HTTP, la modalità di trasferimento non si propaga attraverso una connessione o ai server proxy e agli altri intermediari. L'impostazione della modalità di trasferimento non si riflette nella descrizione del contratto del servizio. Dopo aver generato un proxy per un servizio, è consentito, ma non obbligatorio, modificare il file di configurazione dei servizi per cui si desidera utilizzare il trasferimento con flusso per impostare la modalità di trasferimento. Per i trasporti TCP e named pipe, la modalità di trasferimento viene propagata come asserzione di criteri.

L'uso della Streamed modalità di trasferimento fa sì che il runtime WCF applichi alcune restrizioni.

  • Le operazioni che si verificano in un trasporto con flusso possono presentare un contratto avente al massimo un solo parametro di input e/o di output a livello del modello di programmazione. Questo parametro corrisponde al corpo intero del messaggio e deve essere un messaggio Message, un sottotipo di Stream oppure deve implementare l'interfaccia IXmlSerializable. Definire un valore restituito di un'operazione equivale a definire un parametro di output.

  • Alcune funzionalità WCF, ad esempio Reliable Messaging e la sicurezza a livello di messaggio SOAP, si basano sul buffering dei messaggi per le trasmissioni. 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 sicurezza a livello di trasporto oppure utilizzare una sicurezza a modalità mista che combini le attestazioni WS-Security con la sicurezza del trasporto.

  • Le intestazioni SOAP vengono sempre memorizzate nel buffer, anche quando la modalità di trasferimento è impostata su Streamed. Le intestazioni di un messaggio non devono superare la quota di trasporto indicata nella proprietà MaxBufferSize esposta in varie associazioni ed elementi di associazione.

Il passaggio della modalità di trasferimento da Buffered a Streamed comporta la modifica della forma del canale nativo dei trasporti TCP e named pipe. 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. Ne consegue che i contratti di servizio con sessione non vengono utilizzati con il flusso del trasporto.

Si applica a