服务器无法在HTTP头已发送后添加标头 c# pdf内联

4
我最近遇到了一个问题,想要返回PDF内联响应。我在所有可用的编码页面上进行了搜索,但仍然无法找到适用于此问题的答案。下面是我制作的一个简化示例,但核心部分与实际生产环境相同。虽然这个问题并不总是发生,但当它发生时非常恼人。似乎像是某种奇怪的时间问题或者其他一些我没有看到的问题。
我收到了这个错误信息:System.Web.HttpException (0x80004005): File Not Found ---> System.Web.HttpException (0x80004005): Server cannot append header after HTTP headers have been sent.
有人知道如何解决吗?
    [HttpGet]
    public ActionResult PDF(string id, bool inline = false)
    {
        try
        {
            MemoryStream PDFStream = GetPdfStream(id);

            PDFStream.Position = 0;

            string PDFFile = "Test.pdf";


            if (inline)
            {
                Response.AppendHeader("Content-Disposition", string.Format("inline; filename={0}", PDFFile));
                Response.BufferOutput = true;
                return File(PDFStream, MediaTypeNames.Application.Pdf);
            }
            else
                return File(PDFStream, MediaTypeNames.Application.Pdf, PDFFile);
        }
        catch (Exception Ex)
        {
            throw new HttpException(404, "File Not Found", Ex);
        }
    }

请注意,如果您的文件名包含空格、某些分隔符或非ASCII字符,则会创建无效的内容分发值。有关详细信息,请参阅RFC 6266。 - Julian Reschke
1个回答

2

在添加新的头之前,您必须首先清除头部

if (inline)
{
   Response.ClearHeaders();

Response.AppendHeader("Content-Disposition", string.Format("inline; filename={0}", PDFFile));
Response.BufferOutput = true;
return File(PDFStream, MediaTypeNames.Application.Pdf);
}
else
return File(PDFStream, MediaTypeNames.Application.Pdf, PDFFile);

我想我试过了。但我会再试一次,看看效果如何。同时,我仍然开放接受其他建议。 - kyleb
@kyleb 根据 MSDN 的说明,Response.Clear() 方法会清除任何缓存的 HTML 输出。然而,Clear 方法仅会清除响应正文,而不清除响应头。如果您需要清除响应头,请使用 ClearHeaders 方法。 - HatSoft
1
现在我得到了“服务器无法在HTTP标头发送后设置状态”的错误。 :( - kyleb
@kyleb,这个错误可能是因为在Response.ClearHeaders之前已经设置了一些东西。我的怀疑是:MemoryStream PDFStream = GetPdfStream(id); - HatSoft
我为什么要获取一个与头部分离的内存流与这个错误有任何关系? - kyleb
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接