Cabeçalhos duplicados recebidos do servidor


119

Cabeçalhos duplicados recebidos do servidor

A resposta do servidor continha cabeçalhos duplicados. Esse problema geralmente é o resultado de um site ou proxy mal configurado. Somente o administrador do site ou proxy pode corrigir esse problema.

Erro 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): Vários cabeçalhos de disposição de conteúdo distintos recebidos. Isso não é permitido para proteger contra ataques de divisão de resposta HTTP.

Encontrei este erro ao exportar para pdf no Chrome.

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

Como consertar isto?


18
Também descobri que a vírgula no nome do arquivo apresentará esse erro (apenas no Chrome). Estou pensando que deve haver uma maneira de dizer que o nome do arquivo = "abc, xyz.pdf" é válido. Entendo que podemos substituir o "," por outra coisa, mas quero preservar e retornar o nome do arquivo exatamente como está. Nenhum dos outros navegadores (IE, FireFox, Safari, Opera) que tentei tem esse problema.
— cusman de

29
Portanto, há uma maneira de permitir que ainda tenha vírgulas no nome do arquivo. Basta citar o nome do arquivo. Response.AddHeader("content-disposition", "attachment; filename=\"" + FileNameWithCommas + "\"");
— cusman de

3
Obrigado @cusman. Esse foi exatamente o meu problema - uma vírgula no nome do arquivo E apenas o Chrome teve um problema com isso.
— PeterKA

Respostas:


236

Este era um pouco antigo, mas estava no topo do ranking do google, então pensei em dar a resposta que encontrei no Chrome, exibição de pdf, cabeçalhos duplicados recebidos do servidor

Basicamente, meu problema também era que o nome do arquivo continha vírgulas. Substitua as vírgulas para removê-las e você ficará bem. Minha função para criar um nome de arquivo válido está abaixo.

    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
A partir do comentário de @roryok na resposta vinculada, aspas ao redor do nome do arquivo devem corrigir os problemas. E, na verdade, a especificação parece dizer que o nome do arquivo deve ser citado.
— Touko

As aspas seriam uma ajuda (e devem ser adicionadas), mas esta função tem o benefício adicional de remover caracteres inválidos para que você crie um nome mais amigável no final.
— Bryan Roberts

@Younisbarznji funcionou para mim, você precisa escapar das aspas no nome do arquivo
— coffekid

3
Funciona para mim! Vírgulas e espaços não são uma boa ideia em nomes de arquivos!
— Hugo

Por que .Replace(";", "").Replace(",", "")quando já está substituindo por RegEx? Adicione ;,ao seu padrão RegEx:string invalidReStr = string.Format(@"[{0};,]+", invalidChars); string replace = Regex.Replace(name, invalidReStr, "_");
— SBF

97

O servidor DEVE colocar aspas duplas ao redor do nome do arquivo, conforme mencionado por @cusman e @Touko em suas respostas.

Por exemplo:

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

Também substituí todas as aspas duplas no nome do arquivo por sublinhados.
— Peter L

Fiz o mesmo, obtendo aqui também o nome do arquivo com sublinhados.
— Jamsheer

5

Para mim, o problema era sobre uma vírgula não no nome do arquivo, mas como abaixo: -

Response.ok (streamingOutput, MediaType.APPLICATION_OCTET_STREAM_TYPE) .header ("content-disposition", " anexo, nome do arquivo = your_file_name"). Build ();

Eu acidentalmente coloquei uma vírgula após o anexo. Resolvi o problema substituindo a vírgula por um ponto e vírgula.


3

Basta colocar um par de aspas duplas em torno do nome do arquivo como este:

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


Mas há um sublinhado no nome do arquivo baixado.
— Jamsheer

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.