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?

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

Deepak Agrawal
fuente
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} \ "");

usuario3578181
fuente
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.

Will Brownsberger
fuente