Контроллер MVC, получить файл из WebAPI и вернуть как FileResult

Мой контроллер должен вызвать метод WebAPI, который вернет объект HttpResponseMessage с файлом PDF в Content. Мне нужно немедленно вернуть этот файл как объект FileResult из контроллера. Я экспериментировал с рядом решений, собранных из кода, найденного повсюду, но кажется, что все методы сохранения файлов в асинхронном режиме, и я столкнулся с проблемами, возвращающими файл в виде FileResult немедленно в одном и том же методе контроллера. Каков наилучший подход в этом сценарии?

Некоторый код, который я пробовал:

System.Threading.Tasks.Task tsk = response.Content.ReadAsFileAsync(localPath, true).ContinueWith(
                    (readTask) =>
                    {
                        Process process = new Process();
                        process.StartInfo.FileName = localPath;
                        process.Start();
                    });
                await tsk;

                return File(localPath, "application/octetstream", fileName);

Это была моя основная идея, получить файл из содержимого ответа и вернуть его как FileResult. Но это выбрасывает доступ отказано в ожидании tsk.

1 ответ

Решение

Вам не нужно сохранять файл на вашем диске в виде файла, вы можете просто работать с потоком следующим образом:

public async Task<FileResult> GetFile()
{
    using (var client = new HttpClient())
    {
        var response = await client.GetAsync("https://www-asp.azureedge.net/v-2017-03-27-001/images/ui/asplogo-square.png");
        var contentStream = await response.Content.ReadAsStreamAsync();

        return this.File(contentStream, "application/png", "MyFile.png");
    }
}

Надеюсь, это поможет!

Другие вопросы по тегам