ASP.Net Core 从 FileStreamResult 返回 500 INTERNAL SERVER ERROR

Dev*_*-er 5 memorystream exception filestream asp.net-core

使用 MemoryStream 写入 PDF 时,ASP.Net Core 从 FileStreamResult 返回 500 服务器错误

公共异步任务<Stream> DownloadDocumentInfoAsPdfAsync(用户登录用户){
    尝试 {
        var conversionOptions = 新 ConversionOptions {
            边距 = 新的 MarginSettings(20, 5.5, 10, 5.5),
        };

        //从byte[]创建新的MemoryStream
        返回新的 MemoryStream(_htmlToPdfConverter.ConvertHtml(html, conversionOptions));
    }
}

//从上面的函数返回FileStream。
公共异步任务 <IActionResult>GenerateReport([FromRoute] string info) {
    var 结果 = wait _mediator.Send(query);
    return File(结果, "application/pdf", "employee.pdf"); //这将通过 500 INTERNAL SERVER ERROR
}

Dev*_*-er 22

如果您已验证您创建的流有效,则很有可能流的位置尚未重置为流的开头。这样做的结果是 FileStreamResult 尝试创建一个流,但从它的结束位置开始,没有找到任何其他数据,因此尝试写出一个空白流,这是错误的原因(这不会作为异常抛出)。

要解决此问题,您需要将正在使用的流重置为其起始位置。结果.Position = 0; 然后,在将 MemoryStream 写入 FileStreamResult 之前,该行会重置 MemoryStream。

// 在返回 FileStream 之前,将 MemoryStream 上的位置重置为 IActionResult() 函数的开头

结果.Position = 0;
//返回文件(结果,"application/pdf","Employee.pdf")