在我的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);
}
答案 0 :(得分:1)
在您的GetPdf
方法中,您要将FileStreamResult
传递给Ok()
方法。这将使用默认的序列化器序列化FileStreamResult
并将其发送到客户端,因此为什么您会看到JSON。
通常,您的服务层不应返回MVC WhateverResult
对象,而应返回旨在表示要检索的实际数据的对象-在您的情况下,这将是PDF文件。解决您的特殊情况的最简单方法可能是执行以下操作:
GetPdfFile
以返回Task<FileStream>
而不是Task<FileStreamResult>
return stream;
GetPdf
的return语句更改为return File(result, "application/pdf");
这将使您的服务层以流的形式返回PDF文件,然后让您的GetPdf
端点以application/pdf
文件类型的文件形式返回该流。