2010-04-08 3 views
2

У меня есть обработчик ashx со следующим кодом. Идея заключается в том, чтобы скрыть путь файла и запрос на загрузкуSystem.OutOfMemoryException на файл скачать

 context.Response.Clear(); 
     context.Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName); 
     context.Response.AddHeader("Content-Length", file.Length.ToString()); 
     context.Response.ContentType = "application/octet-stream"; 
     context.Response.WriteFile(file.FullName); 

Это прекрасно работает для некоторых файлов, однако на других я получаю

Исключение из «System.OutOfMemoryException» типа был выброшен.

+1

В Кассини? IIS? – JoeBilly

+0

Какова длина файлов, генерирующих исключение? – kgiannakakis

+0

Это IIS7, размер всего файла - 7 Мб. Иногда это работает. Я думаю, что я должен обернуть это в оператор using. Любые мысли о том, что он должен реализовать – frosty

ответ

6

Очень странно, 7Mb действительно мало. Может быть, есть ограничение на ваш пул приложений?

Если вам нужен только обработчик загрузки файлов, используйте HttpResponse.TransmitFile(), которые не задерживают файл в памяти.

http://msdn.microsoft.com/en-us/library/12s31dhy%28VS.80%29.aspx

+0

@joe, см. На этой странице http://msdn.microsoft.com/en-us/library/e1f13641.aspx, httpRuntime -> maxRequestLength и, вероятно, appRequestQueueLimit --- я ошибался? – Aristos

+0

@ Аристос, О, я вижу! Вы принимаете ** Претензию ** ** и ** Ограничение ответа **;) Поскольку файл передается сервером, его ответ, а не запрос. И предел запроса не выдает OutOfMemoryException, что означает проблему с реальной памятью. – JoeBilly

+0

+1 Благодарим вас за информацию. – Aristos

0

Вы заполнили системную память. С большими файлами передаваемые данные буферизуются в памяти. Я бы предложил создать собственный метод кэширования.