ASP.Net 核心 returns 来自 FileStreamResult 的 500 内部服务器错误

ASP.Net Core returns a 500 INTERNAL SERVER ERROR from a FileStreamResult

ASP.Net Core returns 使用 MemoryStream 写入 PDF 时 FileStreamResult 出现 500 服务器错误

public async Task <Stream> DownloadDocumentInfoAsPdfAsync(User loggedInUser) {
    try {
        var conversionOptions = new ConversionOptions {
            Margins = new MarginSettings(20, 5.5, 10, 5.5),
        };

        //Creating new MemoryStream from byte[]
        return new MemoryStream(_htmlToPdfConverter.ConvertHtml(html, conversionOptions));
    }
}

//Returning FileStream from above function.
public async Task <IActionResult> GenerateReport([FromRoute] string info) {
    var result = await _mediator.Send(query);
    return File(result, "application/pdf", "employee.pdf"); //This will through 500 INTERNAL SERVER ERROR
}

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

要解决此问题,您需要将正在使用的流重置到它的起始位置。 result.Position = 0;行然后在将 MemoryStream 写出到 FileStreamResult 之前重置 MemoryStream。

// Reset the position on the MemoryStream to the beginning in IActionResult() function before returing FileStream

result.Position = 0;
//return File(result,"application/pdf","Employee.pdf")