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?

Purvesh Desai
fonte
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;
    }
Bryan Roberts
fonte
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 + "\"");
tomc
fonte
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.

Deepak Agrawal
fonte
3

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

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

user3578181
fonte
Mas há um sublinhado no nome do arquivo baixado.
Jamsheer
1

Aspas duplas ao redor do nome do arquivo no cabeçalho são o padrão para os documentos da web MDN. Omitir as aspas cria várias oportunidades para problemas decorrentes de caracteres no nome do arquivo.

Will Brownsberger
fonte