Après avoir parcouru l'internet pendant des heures, je ne sais plus comment résoudre mon problème pour ASP.NET Core 2.x.
Je génère un CSV à la volée (ce qui peut prendre plusieurs minutes) et j'essaie ensuite de le renvoyer au client. De nombreux clients se coupent avant que je ne commence à envoyer une réponse. J'essaie donc de leur renvoyer le fichier en streaming (avec une réponse 200 immédiate) et d'écrire dans le flux de manière asynchrone. Il semble que cela soit possible avec PushStreamContent
précédemment en ASP, mais je ne sais pas comment structurer mon code pour que la génération du CSV se fasse de manière asynchrone et renvoie immédiatement une réponse HTTP.
[HttpGet("csv")]
public async Task<FileStreamResult> GetCSV(long id)
{
// this stage can take 2+ mins, which obviously blocks the response
var data = await GetData(id);
var records = _csvGenerator.GenerateRecords(data);
// using the CsvHelper Nuget package
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
var csv = new CsvWriter(writer);
csv.WriteRecords(stream, records);
await writer.FlushAsync();
return new FileStreamResult(stream, new MediaTypeHeaderValue("text/csv))
{
FileDownloadName = "results.csv"
};
}
Si vous faites une demande à cette méthode de contrôleur, vous n'obtiendrez rien jusqu'à ce que tout le CSV ait fini de se générer et que vous obteniez enfin une réponse, moment auquel la plupart des demandes des clients ont expiré.
J'ai essayé d'inclure le code de génération du CSV dans un fichier de type Task.Run()
mais cela n'a pas aidé mon problème non plus.