Progettazione endpoint del servizio C # .NET per il download di file di grandi dimensioni

1

Ho un'interfaccia utente e un server di backend .NET C # che comunicano tra loro. Ho una route /getBigFile che l'interfaccia utente richiama un clic del pulsante, che il backend C # può richiedere fino a 60 secondi per creare e restituire in modo che l'utente possa scaricarlo. (Le dimensioni del file possono variare da 1 kB a 600 MB.)

Ciò significherebbe che l'interfaccia utente dovrebbe attendere con una connessione aperta finché C # non restituisce HttpResponse. Questo è ovviamente un cattivo progetto in quanto costringe l'utente a rimanere sulla pagina web fino a quando il file ritorna.

Ho pensato a diverse soluzioni per questo:

  • Trasmetti il file all'interfaccia utente in modo che il download inizi subito.

  • Il backend C # restituisce un httpResponse subito dopo l'avvio di un lavoro asincrono che crea il file, lo carica su S3 e invia il file via email in caso di successo / fallimento. (La parte del lavoro asincrono funzionerà anche se la connessione del server client è chiusa)

Non sono sicuro di quale sia il modo migliore. Il primo modo sembra la migliore scelta UX, ma quando più utenti richiedono file di grandi dimensioni, mi sento come se la seconda scelta venga gestita in modo migliore se la implemento con un meccanismo di Queuing (usando Amazon SQS o Redis. Non so davvero come questo funzionerà comunque.)

Non ho mai dovuto progettare qualcosa di simile e qualsiasi suggerimento e risorsa / guida sarebbe molto apprezzato!

    
posta smbl 23.09.2017 - 07:00
fonte

1 risposta

1

Se la creazione del file è progressiva, non è necessario attendere 60 secondi prima di iniziare il download. Invia il file all'utente mentre lo stai creando, risparmiando fino a 60 secondi ai tuoi utenti.

Questo si applicherebbe a molti processi come crittografia, compressione, conversione video, ecc. Un caso problematico sarebbe quello in cui devi elaborare l'intero file per sapere quali sarebbero i suoi primi byte (ad esempio se il il formato del file richiede di specificare la sua lunghezza o il suo hash). Se questo è il tuo caso, vedi se esiste un modo per eludere la limitazione.

Si noti che in alcuni casi, si sarà persino in grado di specificare la dimensione del file prima di inviarlo all'utente (e se è possibile farlo, è una funzionalità molto carina, in modo che il browser Web mostri la barra di avanzamento durante il download del file). Ad esempio, molti algoritmi di crittografia restituiscono tanti byte come input, rendendo così semplice determinare la dimensione effettiva del file risultante.

Altrimenti, il POST HTTP che inizia l'elaborazione del file dovrebbe restituire solo un ID che consente di tracciare la progressione del primo stadio. Una volta che il primo stadio è terminato e il file può essere scaricato, un altro percorso dovrebbe consentire il download del file utilizzando l'ID originale. Questo può essere facilmente utilizzato con il polling AJAX per consentire all'utente di attendere prima di scaricare il file e quindi presentarlo con un link per il download.

    
risposta data 23.09.2017 - 10:11
fonte

Leggi altre domande sui tag