2009-12-20 40 views
13

Sto cercando di utilizzare WCF per un progetto che richiede la possibilità per le persone di caricare file di grandi dimensioni (64 MB-1 GB) sul mio server. Come gestirlo con WCF, possibilmente con la possibilità di riprendere i caricamenti.Come gestire i caricamenti di file di grandi dimensioni tramite WCF?

Per gestire una base di clienti più ampia, volevo testare JSON tramite WCF. Come influirebbe sul caricamento del file? Può essere eseguito da JSON o è necessario passare a REST per la porzione di caricamento?

risposta

15

Se si desidera caricare file di grandi dimensioni, sarà sicuramente necessario esaminare WCF Streaming Mode.

Fondamentalmente, è possibile modificare la modalità di trasferimento sull'associazione; per impostazione predefinita, è memorizzato nel buffer, ovvero l'intero messaggio deve essere memorizzato nel buffer del mittente, serializzato e quindi trasmesso nel suo complesso.

Con Streaming, è possibile definire lo streaming unidirezionale (solo per gli upload, solo per i download) o lo streaming bidirezionale. Questo viene fatto impostando il transferMode del tuo binding su StreamedRequest, StreamedResponse, o semplicemente su Streamed.

<bindings> 
    <basicHttpBinding> 
     <binding name="HttpStreaming" 
       maxReceivedMessageSize="2000000" 
       transferMode="StreamedRequest"/> 
    </basicHttpBinding> 
</bindings> 

Poi è necessario disporre di un contratto di servizio che o riceve un parametro di tipo Stream (per il caricamento), oppure restituisce un valore di tipo Stream (per i download).

[ServiceContract] 
public interface IFileUpload 
{ 
    [OperationContract] 
    bool UploadFile(Stream stream); 
} 

Questo dovrebbe farlo!

+0

Cosa fare se la richiesta/risposta deve seguire uno schema specifico? Vale a dire, wat se la richiesta deve essere un oggetto specifico, e la tua wsdl deve rifletterci? Come lo applicheresti con un flusso? – Jeremy

+0

@Jeremy: come la mia risposta dice: se si desidera utilizzare il trasferimento in streaming, è possibile ** solo ** utilizzare un singolo parametro di tipo 'Stream' (o un valore di ritorno di tipo' Stream'). Se non è possibile progettare il servizio in questo modo e devono seguire altri requisiti specifici, sfortunatamente non è possibile utilizzare il trasferimento di streaming. Non c'è un modo * magico * per fare questo lavoro. –

+0

@marc_s che ne dici di un singolo grande parametro stringa? [La mia domanda recente] (https://stackoverflow.com/questions/48774474/parameter-size-limit-for-strings#comment84577011_48774474) è stata contrassegnata come duplicata di questo, ma posso impostare il parametro corretto per passare facilmente 1.2 gb 'byte [] 'parametro per metodo senza problema, ma se si modifica il tipo di parametro da' byte [] 'a' stringa', si limita a circa 28 mb. Devo avere 'stringa' come parametro. – Franck

0

È possibile utilizzare webHttpBinding con TransferMode in streaming e un singolo parametro Stream o Stream response (come appropriato) per file di grandi dimensioni/download, ma è necessario inviare qualsiasi metadata di richiesta tramite URL e/o intestazioni, a meno che non siate intenzione di ideare la propria inquadratura sullo Stream. Dovrai creare un client non HTML personalizzato (come Silverlight, Flash, ecc.), Poiché i browser non supportano l'accesso casuale ai file locali, e il normale caricamento dei file sarà un post del modulo, non JSON.

1

MTOM è ottimizzato per gestire grandi dati binari.

+1

MTOM da solo in realtà non aiuta molto - è ancora necessario assemblare l'intero messaggio in un buffer da trasmettere. –

Problemi correlati