У меня есть следующее действие, которое генерирует файл:
public async Task<IActionResult> GetFile()
{
//some long running action to actually generate the content
//(e.g. getting data from DB for reporting)
await Task.Delay(10000);
return File(new byte[]{}, "application/octet-stream");
}
Проблема в том, что когда пользователь переходит по этой ссылке, между нажатием действия и браузером, отображающим файл как загружаемый, возникает большая задержка.
На самом деле я хочу, чтобы ASP.Net отправлял заголовки с именами файлов (чтобы браузер показывал пользователю, что файл начал загружаться) и откладывал отправку тела при создании содержимого файла.Можно ли это сделать?
Я попробовал следующее:
public async Task GetFile()
{
HttpResponse response = this.HttpContext.Response;
response.ContentType = "application/octet-stream";
response.Headers["Content-Disposition"] = "inline; filename=\"Report.txt\"";
//without writing the first 8 bytes
//Chrome doesn't display the file as being downloaded
//(or ASP.Net doesn't actually send the headers).
//The problem is, I don't know the first 8 bytes of the file :)
await response.WriteAsync(string.Concat(Enumerable.Repeat("1", 8)));
await response.Body.FlushAsync();
await Task.Delay(10000);
await response.WriteAsync("1234567890");
}
Приведенный выше код работает, и я был бы счастлив, если бы мне не пришлось response.WriteAsync
первые 8 байт для отправляемых заголовков.
Есть ли другие способы преодоления этого?