asp.net mvc 3 - Chrome, pantalla de PDF, encabezados duplicados recibidos del servidor
asp.net-mvc-3 google-chrome (6)
Tengo una sección en un sitio web donde muestro un pdf dentro de una caja de luz. La reciente actualización de Chrome ha roto esta visualización:
Error 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): Se recibieron varios encabezados de contenido y disposición. Esto no está permitido para proteger contra los ataques de división de respuesta HTTP.
Esto todavía funciona correctamente en IE.
Estoy usando ASP.NET MVC3 en IIS6
El código que uso para generar el archivo es el siguiente.
Si elimino la instrucción en línea, entonces las descargas de archivos, sin embargo, rompen la funcionalidad de la caja de luz.
Código de problema
public FileResult PrintServices()
{
//... unrelated code removed
MemoryStream memoryStream = new MemoryStream();
pdfRenderer.PdfDocument.Save(memoryStream);
string filename = "ServicesSummary.pdf";
Response.AppendHeader("Content-Disposition", "inline;");
return File(memoryStream.ToArray(), "application/pdf", filename);
}
La solución
retirar
Response.AppendHeader("Content-Disposition", "inline;");
Entonces cambia
return File(memoryStream.ToArray(), "application/pdf", filename);
a
return File(memoryStream.ToArray(), "application/pdf");
Estaba teniendo el mismo problema y lo solucioné simplemente eliminando el nombre del archivo de la declaración de devolución.
Cambio:
return File(outStream.ToArray(), "application/pdf", "Certificate.pdf");
a:
return File(outStream.ToArray(), "application/pdf");
Y MANTÉNGASE:
Response.AddHeader("content-disposition", "attachment;filename=/"" + "Certificate.pdf" + "/"");
Esto aún conserva el nombre del archivo descargado.
La solución anterior está bien si no necesita especificar el nombre del archivo, pero queríamos mantener el nombre del archivo predeterminado especificado para el usuario.
Nuestra solución terminó siendo el nombre del archivo, ya que contenía algunas comas. Hice un reemplazo en las comas con "" y el archivo ahora entrega el documento como se esperaba en Chrome.
FileName = FileName.Replace(",", "")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=" & FileName)
Response.BinaryWrite(myPDF)
Mi problema se debió a la comilla doble como se muestra a continuación:
var encoding = System.Text.Encoding.UTF8;
*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**/"{0}/"**", HttpUtility.UrlEncode(file, encoding)));*
¡Cambiar lo anterior a esto funcionó!
*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**{0}**", HttpUtility.UrlEncode(file, encoding)));*
Tuve este problema hoy. Per roryok y otros, la solución fue poner el nombre de archivo entre comillas.
Anterior, Chrome FAIL:
header("Content-Disposition: attachment; filename=$file");
Actual, Chrome OK:
header("Content-Disposition: attachment; filename=''$file''");
Tenga en cuenta las cotizaciones alrededor de $file
.
Usé el comentario de @roryok, envolviendo el nombre del archivo entre comillas:
Response.AddHeader("content-disposition", "attachment; filename=/"" + FileName + "/"")
La respuesta de @a coder de usar comillas simples no funcionó como se esperaba en IE. El archivo descargado con las comillas simples sigue en el nombre.
para arreglar esto para cualquier tipo de archivo con un nombre de archivo personalizado eliminar el (o encabezados similares)
Response.AppendHeader("Content-Disposition", "inline;");
y añadir
string fileName = "myfile.xlsx"
return File(fileStream, System.Web.MimeMapping.GetMimeMapping(Path.GetFileName(filePath)), fileName);
también puede usar el camino de archivo en lugar de una secuencia en el primer parámetro