【问题标题】:Duplicate headers received from server从服务器收到重复的标头
【发布时间】:2012-11-14 17:33:11
【问题描述】:

从服务器收到重复的标头

来自服务器的响应包含重复的标头。此问题通常是由于网站或代理配置错误造成的。只有网站或代理管理员可以解决此问题。

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

我在 chrome 中导出为 pdf 时发现此错误。

Response.Buffer = false;
Response.ClearHeaders();
string ext = objProp.PACKAGEFILENAME.Substring(objProp.PACKAGEFILENAME.LastIndexOf("."));
string ext1 = ext.Substring(1);
Response.ContentType = ext1;
Response.AddHeader("Content-Disposition", "target;_blank,attachment; filename=" + objProp.PACKAGEFILENAME);
const int ChunkSize = 1024;
byte[] binary = objProp.PACKAGEDOCUMENT;
System.IO.MemoryStream ms = new System.IO.MemoryStream(binary);
int SizeToWrite = ChunkSize;

for (int i = 0; i < binary.GetUpperBound(0) - 1; i = i + ChunkSize)
{
    if (!Response.IsClientConnected) return;
    if (i + ChunkSize >= binary.Length) SizeToWrite = binary.Length - i;
    byte[] chunk = new byte[SizeToWrite];
    ms.Read(chunk, 0, SizeToWrite);
    Response.BinaryWrite(chunk);
    Response.Flush();
}
Response.Close();

如何解决这个问题?

【问题讨论】:

  • 我还发现文件名中的逗号会给出该错误(仅在 Chrome 中)。我在想一定有办法告诉它 filename="abc,xyz.pdf" 是有效的。我知道我们可以用其他东西替换“,”,但我想保留并返回原样的文件名。我试过的其他浏览器(IE、FireFox、Safari、Opera)都没有这个问题。
  • 所以有一种方法可以让它在文件名中仍然有逗号。只需要引用文件名。 Response.AddHeader("content-disposition", "attachment; filename=\"" + FileNameWithCommas + "\"");
  • 谢谢@cusman。这正是我的问题 - 文件名中的逗号,只有 Chrome 对此有问题。

标签: google-chrome pdf http-headers


【解决方案1】:

这个有点老,但在谷歌排名很高,所以我想我会抛出我从Chrome, pdf display, Duplicate headers received from the server找到的答案

基本上我的问题也是文件名包含逗号。用逗号替换以删除它们,你应该没问题。我创建有效文件名的功能如下。

    public static string MakeValidFileName(string name)
    {
        string invalidChars = Regex.Escape(new string(System.IO.Path.GetInvalidFileNameChars()));
        string invalidReStr = string.Format(@"[{0}]+", invalidChars);
        string replace = Regex.Replace(name, invalidReStr, "_").Replace(";", "").Replace(",", "");
        return replace;
    }

【讨论】:

  • 来自@roryok 在链接答案中的评论,文件名周围的引号应该可以解决问题。实际上the spec 似乎说应该引用文件名。
  • 引号会有所帮助(并且应该添加),但此功能还有一个额外的好处,即去除无效字符,因此您可以在末尾取一个更友好的名称。
  • @Younisbarznji 它对我有用,您需要转义文件名中的引号
  • 它对我有用!文件名中的逗号和空格不是好主意!
  • 为什么 .Replace(";", "").Replace(",", "") 已经被 RegEx 替换了?将;, 添加到您的正则表达式模式中:string invalidReStr = string.Format(@"[{0};,]+", invalidChars); string replace = Regex.Replace(name, invalidReStr, "_");
【解决方案2】:

服务器应该在文件名两边加上双引号,@cusman 和 @Touko 在他们的回复中提到。

例如:

Response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");

【讨论】:

  • 我还将文件名中的所有双引号替换为下划线。
  • 我也做了同样的事情,这里也得到了带下划线的文件名。
【解决方案3】:

只需在您的文件名周围加上一对双引号,如下所示:

this.Response.AddHeader("Content-disposition", $"attachment; filename=\"{outputFileName}\"");

【讨论】:

  • 但是下载的文件名中有下划线。
【解决方案4】:

对我来说,问题在于不在文件名中的逗号,但如下所示:-

Response.ok(streamingOutput,MediaType.APPLICATION_OCTET_STREAM_TYPE).header("content-disposition", "attachment, filename=your_file_name").build();

我不小心在附件后面放了一个逗号。通过用分号替换逗号来解决它。

【讨论】:

    【解决方案5】:

    标头中的文件名双引号是MDN web docs. 的标准。省略引号会导致文件名中的字符出现问题。

    【讨论】:

      猜你喜欢
      • 2012-02-24
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多