System.OutOfMemoryException

giovedì 04 dicembre 2014 - 13.14
Tag Elenco Tags  C#  |  .NET 4.0

svipla Profilo | Senior Member

Ciao a tutti
utilizzo uploadify per caricare file di grandi dimensioni.
I file caricari sono gestiti da un file ashx.
Quando carico file di grandi dimensione(testato con un file 700MB) ricevo quì:

public void ProcessRequest(HttpContext context)
{
HttpContext.Current.Server.ScriptTimeout = 7200;
context.Response.ContentType = "text/plain";
context.Response.Expires = -1;

string type = context.Request["type"]; //ERRORE

questo errore:
Eccezione di tipo 'System.OutOfMemoryException' in System.Web.dll non gestita nel codice utente.

Naturalmente con file di piccole dimensioni non ricevo errore e ricordo che prima non ricevevo questo errore.

Come gestisco questo errore?

Grazie mille

0v3rCl0ck Profilo | Guru

Ciao, il problema qui è che appena provi a leggere un qualcosa dalla response, lui deve caricare tutto il body della richiesta in memoria, cosa che molto probabilmente non vuoi fare, specialmente se devi semplicemente prendere la richiesta e scriverla da un'altra parte (file, db, ...), in questo caso ti consiglio di fare letture a buffer di qualche KB, in modo da non dovere leggere tutto in memoria, ma avere solo piccoli pezzetti che poi scrivi su file, esistono anche metodi (dal fx 4.0) che lo fanno per te, vedi:

using(var newFile = File.Create(tempPath)) { request.InputStream.CopyTo(newFile); }

oppure senza il CopyTo:

public void ProcessRequest(HttpContext context) { const int BufferSize = 4096; HttpRequest request = context.Request; context.Response.ContentType = "text/html"; context.Response.ContentEncoding = System.Text.Encoding.UTF8; context.Response.Cache.SetCacheability(HttpCacheability.NoCache); var tempFilePath = Path.GetTempFileName(); using (Stream fs = File.OpenWrite(tempFilePath)); { byte[] buffer = new byte[BufferSize]; int read = -1; while(read = request.InputStream.Read(buffer, 0, buffer.Length) > 0) { fs.Write(buffer, 0, buffer.Length); } } context.Response.Write("{\"success\":true}"); context.Response.End(); }

qualche altro link:

http://blogs.msdn.com/b/rohithrajan/archive/2013/01/22/part-3-suggestions-on-implementing-large-file-upload-in-asp-net.aspx


Michael Denny | Microsoft Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.net
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5