从服务器收到重复的标头


119

从服务器收到重复的标头

服务器的响应包含重复的头。此问题通常是网站或代理配置错误的结果。只有网站或代理管理员可以解决此问题。

错误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();

如何解决这个问题?


18
我还发现文件名中的逗号会导致该错误(仅在Chrome中)。我认为必须有一种方法可以告诉它filename =“ abc,xyz.pdf”是有效的。我知道我们可以用其他东西代替“,”,但是我想保留并返回原样的文件名。我尝试过的其他浏览器(IE,FireFox,Safari,Opera)都没有这个问题。
cusman 2014年

29
因此,有一种方法可以让它在文件名中仍然包含逗号。只需引用文件名即可。Response.AddHeader("content-disposition", "attachment; filename=\"" + FileNameWithCommas + "\"");
cusman 2014年

3
谢谢@cusman。那正是我的问题-文件名中的逗号,只有Chrome出现问题。
PeterKA

Answers:


236

这个有点旧,但是在Google排名中很高,所以我想我会把从Chrome,pdf显示,从服务器收到的重复标题中找到的答案

基本上我的问题还在于文件名包含逗号。对逗号进行替换以将其删除,然后应该可以。我制作有效文件名的功能如下。

    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;
    }

22
在链接答案的@roryok注释中,文件名周围的引号应该可以解决问题。实际上,规范似乎说应该使用文件名加引号。
Touko

引号会有所帮助(应该添加引号),但是此功能还具有删除无效字符的额外好处,因此您可以在末尾输入更友好的名称。
布莱恩·罗伯茨

@Younisbarznji它对我有用,您需要对文件名中的引号进行转义
coffekid 2015年

3
这个对我有用!逗号和空格不是文件名中的好主意!
雨果

为什么.Replace(";", "").Replace(",", "")已经用RegEx代替?添加;,到您的RegEx模式:string invalidReStr = string.Format(@"[{0};,]+", invalidChars); string replace = Regex.Replace(name, invalidReStr, "_");
SBF

97

服务器应该在文件名两边加上双引号,就像@cusman和@Touko在答复中提到的那样。

例如:

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

我还用下划线替换了文件名中的所有双引号。
彼得L

我做过同样的事情,这里也得到带下划线的文件名。
Jamsheer

5

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

Response.ok(streamingOutput,MediaType.APPLICATION_OCTET_STREAM_TYPE).header(“ content-disposition”,“ 附件,文件名 =您的文件名 ”).build ();

我不小心在附件后加上了逗号。通过用分号替换逗号来解决该问题。


3

只需在文件名两边加上双引号即可,如下所示:

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


但是下载的文件名中有一个下划线。
Jamsheer

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.