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.