Encabezados duplicados recibidos del servidor


119

Encabezados duplicados recibidos del servidor

La respuesta del servidor contenía encabezados duplicados. Este problema generalmente es el resultado de un sitio web o proxy mal configurado. Solo el administrador del sitio web o del proxy puede solucionar este problema.

Error 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): Se recibieron varios encabezados de disposición de contenido distintos. Esto no está permitido para proteger contra ataques de división de respuesta HTTP.

Encontré este error al exportar a pdf en 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();

¿Cómo arreglar esto?


18
También descubrí que la coma en el nombre del archivo dará ese error (solo en Chrome). Estoy pensando que debe haber una forma de decirle que el nombre de archivo = "abc, xyz.pdf" es válido. Entiendo que podemos reemplazar el "," con otra cosa, pero quiero conservar y devolver el nombre del archivo exactamente como está. Ninguno de los otros navegadores (IE, FireFox, Safari, Opera) que he probado tiene este problema.
cusman

29
Así que hay una forma de dejar que todavía tenga comas en el nombre del archivo. Solo tienes que citar el nombre del archivo. Response.AddHeader("content-disposition", "attachment; filename=\"" + FileNameWithCommas + "\"");
cusman

3
Gracias @cusman. Ese era exactamente mi problema: una coma en el nombre del archivo Y solo Chrome tuvo un problema con eso.
PeterKA

Respuestas:


236

Este es un poco antiguo pero estaba alto en el ranking de Google, así que pensé en incluir la respuesta que encontré en Chrome, visualización en pdf, encabezados duplicados recibidos del servidor

Básicamente, mi problema también era que el nombre del archivo contenía comas. Reemplace las comas para eliminarlas y debería estar bien. Mi función para hacer un nombre de archivo válido se encuentra a continuación.

    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
Desde el comentario de @roryok en la respuesta vinculada, las comillas alrededor del nombre del archivo deberían solucionar los problemas. Y en realidad, la especificación parece decir que el nombre del archivo debe estar entre comillas.
Touko

Las comillas serían una ayuda (y deberían agregarse) pero esta función tiene el beneficio adicional de eliminar los caracteres no válidos para que pueda hacer un nombre más amigable al final.
Bryan Roberts

@Younisbarznji funcionó para mí, necesitas escapar de las comillas en el nombre del archivo
coffekid

3
¡Esto funciona para mi! ¡Las comas y los espacios no son una buena idea en los nombres de archivo!
Hugo

¿Por qué .Replace(";", "").Replace(",", "")cuando ya se reemplaza por RegEx? Agregue ;,a su patrón de RegEx:string invalidReStr = string.Format(@"[{0};,]+", invalidChars); string replace = Regex.Replace(name, invalidReStr, "_");
SBF

97

El servidor DEBE poner comillas dobles alrededor del nombre del archivo, como lo mencionan @cusman y @Touko en sus respuestas.

Por ejemplo:

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

También reemplacé las comillas dobles en el nombre del archivo con guiones bajos.
Peter L

He hecho lo mismo, aquí también obtengo el nombre de archivo con guiones bajos.
Jamsheer

5

Para mí, el problema se trataba de una coma no en el nombre del archivo, sino de la siguiente manera:

Response.ok (streamingOutput, MediaType.APPLICATION_OCTET_STREAM_TYPE) .header ("contenido-disposición", " adjunto, nombre de archivo = su_nombre_archivo"). Build ();

Puse accidentalmente una coma después del archivo adjunto. Lo resolví reemplazando la coma con un punto y coma.


3

Simplemente coloque un par de comillas dobles alrededor de su nombre de archivo como este:

this.Response.AddHeader ("Content-disposition", $ "adjunto; nombre de archivo = \" {outputFileName} \ "");


Pero hay un guión bajo en el nombre del archivo descargado.
Jamsheer

1

Las comillas dobles alrededor del nombre del archivo en el encabezado son el estándar según los documentos web de MDN. Omitir las comillas crea múltiples oportunidades para problemas que surgen de los caracteres en el nombre del archivo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.