Questo è un problema che ho indagato nell'ultima settimana e non riesco a trovare alcuna soluzione. Ha trovato post chiedendo la stessa cosa ma senza ottenere una risposta, sperando che questo possa aiutare anche gli altri.Come interrompere un flusso dal servizio WCF senza leggerlo per terminare?
Ho un servizio WCF
che restituisce un oggetto contenente un stream
al suo interno. Io uso basicHttpBinding
con trasferimento in streaming e Mtom per inviarlo al client.
cliente chiama il servizio WCF
e chiude immediatamente dopo il proxy riceve l'oggetto risposta.
Successivamente, il client legge lo stream ricevuto dal servizio WCF e lo scrive in un file sul disco locale. Tutto questo funziona bene.
Il mio problema si verifica quando il client desidera interrompere l'operazione e interrompere il download dei dati dal servizio WCF. Se chiamo .close()
sullo stream, ad esempio: serverReply.DataStream.Close();
, blocca e legge l'intero flusso dal servizio WCF fino alla sua fine prima di continuare. Lo stream può essere abbastanza grande e la rete non è sempre veloce.
Questo è molto indesiderabile sia per l'utilizzo delle risorse di rete, che è fondamentalmente sprecato per i dati che non ha più alcun utilizzo. E poiché basicHttpBinding
consente solo due connessioni TCP simultanee (per impostazione predefinita) al server di servizio WCF, blocca altri tentativi di connessione finché il flusso non viene letto fino alla fine.
mi potrebbe aumentare il numero di connessioni simultanee, ma sarebbe una cattiva soluzione come sarebbe creare un'apertura di guai.
Ad esempio, 20 download interrotti che stanno ancora scaricando i dati per buttarlo via. Devo interrompere completamente il trasferimento.
Sul client, l'oggetto flusso è solo una normale classe Stream
, quindi ha solo il metodo close, nient'altro.
Chiamare .close()
o .abort()
sull'oggetto proxy non aiuta, non lo distrugge utilizzando .dispose()
o qualsiasi altro metodo. Sul lato server, gestisco l'evento OperationContext.OperationCompleted
, ma non viene attivato finché i dati dallo stream
non vengono letti fino alla fine.
Quindi la domanda è: come posso chiudere/interrompere lo streaming senza leggerlo interamente?
Qualche fortuna con questo? – Schultz9999
Soffrendo dello stesso problema durante l'invio di file molto grandi ... sembra che manchi qualcosa di veramente ovvio. probabilmente dovrò implementare il chunking come soluzione alternativa. –