Attualmente sto sviluppando per un ambiente con scarsa connettività di rete. La mia applicazione aiuta a scaricare automaticamente i file di Google Drive richiesti per gli utenti. Funziona abbastanza bene per file di piccole dimensioni (da 40KB a 2MB), ma fallisce troppo spesso per file più grandi (9MB). So che queste dimensioni dei file potrebbero sembrare ridotte, ma in termini di ambiente di rete del mio cliente, l'API di Google Drive fallisce costantemente con il file da 9 MB.C# - Download da Google Drive in blocchi di byte
Ho concluso che ho bisogno di scaricare file in blocchi di byte più piccoli, ma non vedo come posso farlo con l'API di Google Drive. Ho letto this più e più volte, e ho provato il seguente codice:
// with the Drive File ID, and the appropriate export MIME type, I create the export request
var request = DriveService.Files.Export(fileId, exportMimeType);
// take the message so I can modify it by hand
var message = request.CreateRequest();
var client = request.Service.HttpClient;
// I change the Range headers of both the client, and message
client.DefaultRequestHeaders.Range =
message.Headers.Range =
new System.Net.Http.Headers.RangeHeaderValue(100, 200);
var response = await request.Service.HttpClient.SendAsync(message);
// if status code = 200, copy to local file
if (response.IsSuccessStatusCode)
{
using (var fileStream = new FileStream(downloadFileName, FileMode.CreateNew, FileAccess.ReadWrite))
{
await response.Content.CopyToAsync(fileStream);
}
}
Il file locale risultante (da fileStream
), tuttavia, è ancora piena di lunghezza (cioè file di 40 KB per il file di 40 KB unità e un errore interno di 500 server per il file da 9 MB). In un sidenote, ho anche sperimentato con ExportRequest.MediaDownloader.ChunkSize
, ma da quello che osservo cambia solo la frequenza con cui viene richiamata la richiamata ExportRequest.MediaDownloader.ProgressChanged
(vale a dire la richiamata attiverà ogni 256 KB se ChunkSize
è impostata su 256 * 1024).
Come posso procedere?
Hai provato ispezionare la richiesta/risposta utilizzando un proxy come http://www.telerik.com/fiddler? Farei doppio controllo sul fatto che il mio cliente sta inviando l'intestazione del range nel modo in cui lo desidero. Inoltre, il post del blog msdn - https://blogs.msdn.microsoft.com/webdev/2012/11/23/asp-net-web-api-and-http-byte-range-support/ - sembra essere un poco utile (anche se focalizzato sul server), e indica che è necessario aspettarsi un codice di ritorno 206, non un 200 se a) si invia la richiesta corretta eb) il server supporta l'intestazione intervallo.Detto questo, sembra che tu stia andando nella giusta direzione. – Sean
@matt, hai mai risolto questo? – Nkosi
@Nkosi Ci scusiamo per la risposta solo ora, alla fine ho rinunciato al progetto, quindi non l'ho mai risolto. Se tu (o chiunque altro) trovi una soluzione, ti preghiamo di postarla come risposta! – matt