Procedura: attivare il flusso
Windows Communication Foundation (WCF) è in grado di inviare messaggi utilizzando trasferimenti con flusso o memorizzati nel buffer. Nella modalità predefinita, ovvero trasferimento con memorizzazione nel buffer, un messaggio deve essere recapitato completamente prima che un destinatario possa leggerlo. Nella modalità di trasferimento con flusso, il destinatario può iniziare a elaborare il messaggio prima che esso venga recapitato completamente. La modalità di trasmissione con flusso è utile quando le informazioni passate sono lunghe e possono essere elaborate in serie. La modalità di trasmissione con flusso è utile anche quando il messaggio è troppo grande per essere completamente memorizzato nel buffer.
Per attivare il flusso, definire correttamente OperationContract e attivare il flusso a livello di trasporto.
Per trasferire dati con flusso
Per trasferire dati con flusso, OperationContract per il servizio deve soddisfare due requisiti:
- Il parametro che contiene i dati da inviare in un flusso deve essere il solo parametro del metodo. Ad esempio, se il messaggio di input è quello da trasmettere, l'operazione deve avere esattamente un parametro di input. Allo stesso modo, se deve essere trasmesso il messaggio di output, l'operazione deve avere esattamente un solo parametro di output o un solo valore restituito.
- Almeno uno dei tipi di parametro e di valori restituiti deve essere Stream, Message o IXmlSerializable.
Di seguito è riportato un esempio di contratto per dati trasferiti con flusso.
L'operazione
GetStream
riceve alcuni dati di input memorizzati nel buffer comestring
, che è memorizzata nel buffer, e restituisceStream
, trasferito con flusso. Viceversa,UploadStream
prende unoStream
(trasmesso) e restituisce unbool
(memorizzato nel buffer).EchoStream
prende e restituisce unoStream
ed è un esempio di un'operazione i cui messaggi di input e output vengono entrambi trasmessi. Infine,GetReversedStream
non prende input e restituisce unStream
(trasmesso).La trasmissione deve essere attivata nell'associazione. Impostare una proprietà TransferMode, che può prendere uno dei valori seguenti:
- Buffered,
- Streamed, che consente di attivare la comunicazione con flusso bidirezionale.
- StreamedRequest, che consente la trasmissione della sola richiesta.
- StreamedResponse, che consente la trasmissione della sola risposta.
BasicHttpBinding espone la proprietà TransferMode sull'associazione come fanno anche NetTcpBinding e NetNamedPipeBinding. La proprietà TransferMode può essere impostata anche sull'elemento di associazione di trasporto e utilizzata in un'associazione personalizzata.
Negli esempi seguenti viene illustrato come impostare TransferMode tramite codice e modificando il file di configurazione. In entrambi gli esempi, inoltre, la proprietà
maxReceivedMessageSize
viene impostata a 64 MB, che pone un limite alla dimensione massima consentita dei messaggi in ricezione. La misura predefinita èmaxReceivedMessageSize
64 KB che è di solito troppo bassa per gli scenari di flusso. Impostare questa quota come appropriato in base alla dimensione massima dei messaggi che l'applicazione si aspetta di ricevere. Si noti inoltre che maxBufferSize controlla la dimensione massima memorizzata nel buffer e l'imposta correttamente.- Nel frammento seguente di configurazione, preso dall'esempio, viene illustrata l'impostazione della proprietà TransferMode su trasmissione in basicHttpBinding e un'associazione HTTP personalizzata:
- Nel frammento di codice seguente viene illustrata l'impostazione della proprietà TransferMode su trasmissione in basicHttpBinding e un'associazione HTTP personalizzata.
- Nel frammento di codice seguente viene illustrata l'impostazione della proprietà TransferMode su trasmissione in un'associazione TCP personalizzata.
Le operazioni
GetStream
,UploadStream
eEchoStream
riguardano entrambe l'invio diretto di dati da un file o il salvataggio diretto dei dati ricevuti in un file. Il codice seguente riguardaGetStream
.
Scrittura di un flusso personalizzato
Per eseguire un'elaborazione speciale su ogni blocco di flusso di dati quando viene inviato o ricevuto, derivare una classe del flusso personalizzato da Stream. Come esempio di flusso personalizzato, il codice riportato di seguito contiene un metodo
GetReversedStream
e una classeReverseStream
.GetReversedStream
crea e restituisce una nuova istanza diReverseStream
. L'elaborazione effettiva si verifica quando il sistema legge dall'oggettoReverseStream
. Il metodoReverseStream.Read
legge un blocco di byte dal file sottostante, li inverte, quindi restituisce i byte invertiti. Questo metodo non inverte l'intero contenuto del file, ma un blocco di byte alla volta. In questo esempio viene illustrato come eseguire l'elaborazione del flusso mentre il contenuto viene letto o scritto da e verso il flusso.
Vedere anche
Concetti
Dati di grandi dimensioni e flussi