从 ASP.NET Core 2 控制器返回 PDF

LeP*_*ump 3 c# asp.net-core

我正在尝试从我的 ASP.NET Core 2 控制器返回一个 PDF 文件。我有这个代码(主要是从这个SO question借来的):

var net = new System.Net.WebClient();
//a random pdf file link
var fileLocation = "https://syntera.io/documents/T&C.pdf";/
var data = net.DownloadData(fileLocation);
MemoryStream content = null;
try
{
    content = new MemoryStream(data);
    return new FileStreamResult(content, "Application/octet-stream");
}
finally
{
    content?.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是我的控制器调用的服务类的一部分。这是来自我的控制器的代码。

public async Task<IActionResult> DownloadFile(string fileName)
{
    var result = await _downloader.DownloadFileAsync(fileName);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

但我不断得到 ObjectDisposedException: Cannot access a closed Stream.

try 和 finally 块是尝试修复它,来自另一个 SO 问题。

主要问题是 A) 这是将 PDF 文件发送回浏览器的正确方法,B) 如果不是,我该如何更改代码以将 pdf 发送到浏览器?

理想情况下,我不想先将文件保存在服务器上,然后将其返回给控制器。我宁愿在将所有内容保留在内存中的同时返回它。

Nko*_*osi 5

finally(总是会得到所谓的后连return),所以它总是处置内容流之前,它可以被发送到客户端,因此错误。

理想情况下,我不想先将文件保存在服务器上,然后将其返回给控制器。我宁愿在将所有内容保留在内存中的同时返回它。

使用一个FileContentResult类来获取原始字节数组数据并直接返回它。

FileContentResult:表示ActionResult在执行时将二进制文件写入响应。

async Task<IActionResult> DownloadFileAsync(string fileName){
    using(var net = new System.Net.WebClient()) {
        byte[] data = await net.DownloadDataTaskAsync(fileName);
        return new FileContentResult(data, "application/pdf") {
            FileDownloadName = "file_name_here.pdf"
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

不需要额外的内存流