如何在.Net Core 2.2中使用IHttpClientFactory下载文件?

时间:2019-04-16 16:52:36

标签: asp.net-web-api asp.net-core

在我的Web应用程序(.net Core 2.2)中,我想添加下载PDF文件的功能。

当用户单击“下载”时-POST发送到WebAPI,服务器通过硬编码的URL(对用户不可见)向其他服务器询问PDF文件,并将文件传递给用户。

我正尝试使用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>而不是Task<FileStreamResult>,但是如果我更喜欢返回ActionResult怎么办?

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

1 个答案:

答案 0 :(得分:1)

在您的GetPdf方法中,您要将FileStreamResult传递给Ok()方法。这将使用默认的序列化器序列化FileStreamResult并将其发送到客户端,因此为什么您会看到JSON。

通常,您的服务层不应返回MVC WhateverResult对象,而应返回旨在表示要检索的实际数据的对象-在您的情况下,这将是PDF文件。解决您的特殊情况的最简单方法可能是执行以下操作:

  • 更改GetPdfFile以返回Task<FileStream>而不是Task<FileStreamResult>
    • 请记住将其return语句更改为return stream;
  • GetPdf的return语句更改为return File(result, "application/pdf");

这将使您的服务层以流的形式返回PDF文件,然后让您的GetPdf端点以application/pdf文件类型的文件形式返回该流。

相关问题