Adicionalmente a la relación anterior que describe la configuración, es posible utilizar TransmitFile a los archivos "corriente". Sin embargo, TransmitFile tiene algunos retrocesos en algunos clientes http.
Este es mi código para "transmitir" archivos al cliente, como una alternativa para TransmitFile. Tenga en cuenta que he tiene una constante de configuración para deshacer la escritura de archivo (que tiene el mismo problema que el suyo OutOfMemory): Código
private void RenderContent(string contentType,string fileName, bool inline);
método:
FileInfo fi = new FileInfo(fileName);
Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = contentType;
Response.CacheControl = "No-cache";
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.AddHeader("Content-Length", fi.Length.ToString());
Response.AddHeader("Content-Disposition", (inline ? "inline" : "attachment") + "; filename=\"" + fi.Name + "\"");
if (cAppInfos.Constant["FallBackToWriteFile"] != null && cAppInfos.Constant["FallBackToWriteFile"] == "true")
{
Response.WriteFile(fileName);
}
else
{
int chunkSize = 8192;
byte[] buffer = new byte[chunkSize];
int offset = 0;
int read = 0;
using (FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
while ((read = fs.Read(buffer, offset, chunkSize)) > 0)
{
if (!Response.IsClientConnected)
break;
Response.OutputStream.Write(buffer, 0, read);
Response.Flush();
}
}
}
He utilizado este código para evitar algunos problemas en transmisión de archivos pdf al antiguo plugin de acrobat reader. Para el parámetro en línea, puede usar "falso".
Además, puede utilizar try/catch alrededor de este código, ya que cualquiera de Response.IsClientConnecter/Write/Flush puede generar excepciones si el cliente se desconecta.
Sin embargo, no estoy usando MVC, y no estoy seguro de que esto sea aceptable para este techno, ya que si no ha usado TransmitFile, puede tener el mismo problema con este código. Si está tratando de incrustar archivos en el elemento de páginas web (¿tal vez como base64?) Esta no es la solución.
Deseo obtener más información acerca de sus requisitos, si necesita otras maneras de lograr sus objetivos.
Gracias - cuando se utiliza el enlace, después de añadir el 'GlobalConfiguration.Configuration.Services.Replace (typeof (WebHostBufferPolicySelector), nuevo NoBufferPolicySelector());' línea de mi archivo Global.asax.cs, consigo el siguiente error: 'El tipo de servicio WebHostBufferPolicySelector no es compatible. ¿Alguna ayuda allí? –
La pregunta es sobre MVC, no API web –