Chrome,pdf显示,从服务器收到的重复标头

时间:2011-12-21 11:06:00

标签: asp.net-mvc-3 google-chrome iis-6

我在网站上有一个部分,我在灯箱内显示pdf。最近的Chrome升级打破了这一点:

  

错误349(net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION):   收到多个Content-Disposition标头。这是不允许的   防止HTTP响应分裂攻击。

这在IE中仍然可以正常工作。

我在IIS6上使用ASP.NET MVC

我用来生成文件的代码如下。

如果删除内联语句,则文件会下载,但会破坏灯箱功能。

问题代码

public FileResult PrintServices()
{
    //... unrelated code removed
    MemoryStream memoryStream = new MemoryStream();
    pdfRenderer.PdfDocument.Save(memoryStream);
    string filename = "ServicesSummary.pdf";

    Response.AppendHeader("Content-Disposition", "inline;");

    return File(memoryStream.ToArray(), "application/pdf", filename);
}

修复

删除

Response.AppendHeader("Content-Disposition", "inline;");

然后改变

return File(memoryStream.ToArray(), "application/pdf", filename);

return File(memoryStream.ToArray(), "application/pdf");

7 个答案:

答案 0 :(得分:69)

如果您不需要指定文件名,上面的解决方案就可以了,但我们希望保留为用户指定的默认文件名。

我们的解决方案最终成为文件名本身,因为它包含一些逗号。我用逗号替换了逗号,现在该文件按照预期在Chrome中提供了文档。

FileName = FileName.Replace(",", "")

Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=" & FileName)    
Response.BinaryWrite(myPDF)

答案 1 :(得分:20)

我使用了@ roryok的评论,用引号括起文件名:

Response.AddHeader("content-disposition", "attachment; filename=\"" + FileName + "\"")
@c编码器使用单引号的答案在IE中无法正常工作。使用单引号下载的文件仍在名称中。

答案 2 :(得分:2)

今天有这个问题。根据roryok和其他人的说法,解决方法是将文件名放在引号中。

上一篇,Chrome失败:

header("Content-Disposition: attachment; filename=$file");

当前,Chrome确定:

header("Content-Disposition: attachment; filename='$file'");

请注意$file周围的引号。

答案 3 :(得分:1)

我遇到了同样的问题并通过从return语句中删除文件名来修复它。

变化:

 return File(outStream.ToArray(), "application/pdf", "Certificate.pdf");

为:

 return File(outStream.ToArray(), "application/pdf");

和KEPT:

Response.AddHeader("content-disposition", "attachment;filename=\"" + "Certificate.pdf" + "\"");

这仍保留下载文件的名称。

答案 4 :(得分:0)

我的问题是由于双引号如下所示:

var encoding = System.Text.Encoding.UTF8;

*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**\"{0}\"**", HttpUtility.UrlEncode(file, encoding)));*

将上述更改为此工作!

*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**{0}**", HttpUtility.UrlEncode(file, encoding)));*

答案 5 :(得分:0)

为具有自定义文件名的任何文件类型修复此问题,删除(或类似标题)

Response.AppendHeader("Content-Disposition", "inline;");

并添加

string fileName = "myfile.xlsx"
return File(fileStream, System.Web.MimeMapping.GetMimeMapping(Path.GetFileName(filePath)), fileName);

您也可以在第一个参数

中使用文件路径而不是流

答案 6 :(得分:0)

此解决方案将保留文件名并在浏览器(.net mvc)中打开文件

Response.Headers["Content-Disposition"] = "inline;filename=\"" + theFile.filename + "\"";
return File(filePath, mimeType);//don't specify filename. It will create second Content-Disposition header