tutorial que paginas pages net mvc microsoft español asp asp.net-mvc file resulttype

que - Cuál es la diferencia entre los cuatro resultados de archivo en ASP.NET MVC



razor pages net core (2)

Gran pregunta ... y merece más detalles. Me encuentro aquí como resultado de una situación interesante. Entregamos algunos archivos adjuntos en formato pdf a través del entorno MVC3 / C #. Nuestro código fue lanzado y comenzamos a recibir algunas respuestas de nuestros clientes que las descargas se comportaban de manera extraña cuando usaban Chrome y el tipo de archivo se convertía a ''pdf-, attachment.pdf-, attachment''. Sí ... lo tienes ... todo el asunto. Por lo tanto, uno podría reescribirlo para que sea solo ''pdf'' y el archivo aún se conservaría intacto, ¡pero qué desastre!

Entonces, para describir la situación inicial, estábamos configurando el encabezado ''Content-Disposition'' y luego devolviendo un FileContentResult ...

var cd = new System.Net.Mime.ContentDisposition { FileName = result.Attachment.FileName, Inline = false }; Response.AppendHeader("Content-Disposition", cd.ToString()); return File(result.Attachment.Data, MimeExtensionHelper.GetMimeType(result.Attachment.FileName), result.Attachment.FileName);

Se veía bien. Funcionó bien en IE. Así que investigué e intenté implementar FileStreamResult en su lugar (manteniendo el setter Content-Disposition):

MemoryStream dataStream = new MemoryStream(); dataStream.Write(result.Attachment.Data, 0, result.Attachment.Data.Length); dataStream.Position = 0; return new FileStreamResult(dataStream, MimeExtensionHelper.GetMimeType(result.Attachment.FileName));

¡Solucionó el problema en Chrome! Hmmm ... pero ¿por qué demonios debería tener que tomar mi matriz de bytes perfectamente buena y transmitirla y luego devolverla a través de esto para que el nombre de archivo funcione correctamente?

Luego vino el violinista.

Con FileContentResult, obtuve 2 Content-Dispositions en el encabezado. Con FileStreamResult, obtuve 1.

FileContentResult agrega un encabezado Content-Disposition al proporcionar el nombre de archivo y Chrome considera que los múltiplos de este encabezado son un error.

Curiosa reacción ... pero definitivamente una que es bueno saber.

ASP.NET tiene cuatro tipos diferentes de resultados de archivos:

  • FileContentResult: envía el contenido de un archivo binario a la respuesta.
  • FilePathResult: envía el contenido de un archivo a la respuesta
  • FileResult: devuelve una salida binaria para escribir en la respuesta
  • FileStreamResult: envía contenido binario a la respuesta utilizando una instancia de Stream

Esas descripciones son tomadas de MSDN y, a excepción de FileStreamResult, las primeras tres son idénticas. Entonces, ¿cuál es la diferencia entre ellos?


FileResult es una clase base abstracta para todos los demás.

  • FileContentResult : lo usa cuando tiene una matriz de bytes que desea devolver como un archivo
  • FilePathResult : cuando tiene un archivo en el disco y desea devolver su contenido (le da una ruta)
  • FileStreamResult : tiene una secuencia abierta, desea devolver su contenido como un archivo

Sin embargo, raramente tendrá que usar estas clases; puede usar una de las sobrecargas de Controller.File y dejar que asp.net mvc haga la magia por usted.