Как скачать файл с помощью IHttpClientFactory в .Net Core 2.2? - PullRequest
0 голосов
/ 16 апреля 2019

В моем веб-приложении (.net Core 2.2) я хочу добавить функциональность загрузки файла PDF.

Когда пользователь нажимает «скачать» - POST отправляется в WebAPI, а сервер запрашивает другой сервердля файла PDF по жестко закодированному URL (невидимому для пользователя), и файл передается пользователю.

Я пытался использовать IHttpClientFactory

Запуск:

services.AddHttpClient("demo", c =>
{
    c.BaseAddress = new Uri("http://www.africau.edu/");
    c.DefaultRequestHeaders.Add("Accept", "application/pdf");
});

Метод для возврата файла PDF:

public async Task<FileStreamResult> GetPdfFile()
{    
    var client = _httpClientFactory.CreateClient("demo");
    var uri = new UriBuilder(client.BaseAddress + "images/default/sample.pdf").Uri;
    var stream = await client.GetStreamAsync(uri);

    return new FileStreamResult(stream, new MediaTypeHeaderValue("application/pdf"));
}

К сожалению, он возвращает файл download.json с: {"fileStream": {"needsDrain": true, "canRead": true, "canWrite": false, "canSeek": false


@ EDIT

Кажется, это потому, что в контроллере вместо * было Task<IActionResult>1025 * а что если я предпочитаю возвращать ActionResult?

public async Task<IActionResult> GetPdf()
{
    var result = await _service.GetPdfFile();
    return Ok(result);
}

1 Ответ

1 голос
/ 16 апреля 2019

В вашем методе GetPdf вы передаете FileStreamResult методу Ok().Это позволит сериализовать FileStreamResult с использованием сериализатора по умолчанию и отправить его клиенту, поэтому вы видите JSON.

Обычно ваш уровень обслуживания должен возвращать не объект MVC WhateverResult, а объектпредназначен для представления фактических данных, которые будут получены - в вашем случае это будет файл PDF.Самый простой способ решить ваш конкретный случай, вероятно, заключается в следующем:

  • изменить GetPdfFile, чтобы вернуть Task<FileStream> вместо Task<FileStreamResult>
    • не забудьте изменить его возвращениеоператор на return stream;
  • изменить оператор возврата GetPdf на return File(result, "application/pdf");

Это позволит вашему служебному слою вернуть файл PDF какпоток, а затем ваша конечная точка GetPdf возвращает этот поток как файл с типом файла application/pdf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...