We used to see a lot memory related issues with File uploading in ASP.NET 1.1 as ASP.NET loads the whole file in memory before saving the file to disk. In ASP.NET 2.0 you can use the FileUpload control which buffers the file on disk while it is being uploaded. This is a great improvement as it does not kill your worker process memory, however if you do not have sufficient space on your disk “C:\” drive then it's likely that you will start seeing those infamous System.OutOfMemoryException's errors again. So the question is where does ASP.NET temporarily buffer the file before it stores it to disk?

 

Dumping out the HttpRawUploadedContent from a memory dump, I can see that the file is buffered in the C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\fileupload20\d909613c\d78e07ba\uploads files folder and is called f-zqaz-r.post

 

0:008> !do 017c3fbc

Name: System.Web.HttpRawUploadedContent+TempFile

MethodTable: 68a870e0

EEClass: 68a87070

Size: 20(0x14) bytes

GC Generation: 0

 (C:\WINDOWS\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll)

Fields:

      MT    Field   Offset                 Type VT     Attr    Value Name

7a754a14  4000fb0        4 ...empFileCollection  0 instance 017c4944 _tempFiles

790fa3e0  4000fb1        8        System.String  0 instance 017c54e4 _filename

790fe3c8  4000fb2        c     System.IO.Stream  0 instance 017c55f8 _filestream

 

0:008> !do 017c54e4

Name: System.String

MethodTable: 790fa3e0

EEClass: 790fa340

Size: 262(0x106) bytes

GC Generation: 0

 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)

String: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\fileupload20\d909613c\d78e07ba\uploads\f-zqaz-r.post

 

If you want to change the default location, The tempDirectory attribute of the <compilation> element allows you to specify the directory to use for temporary file storage during compilation. The default is an empty string (""). In the case of an empty string, and if the current process has the required access permissions, the files are stored in the %FrameworkInstallLocation%\ Temporary ASP.NET Files directory.

For more details on <compilation> element see http://msdn2.microsoft.com/en-us/s10awwz0.aspx   

 

I tested this by creating a folder called “D:\TempFileFolder” and modifying the web.config to <compilation debug="false" tempDirectory="D:\TempFileFolder"/> . The path specified for the files to be uploaded was D:\Uploads.  Now running the application uploads the file to D:\uploads and all the temporary files are stored in “D:\TempFileFolder”

 

Running Filemon you can see the sequence of Disk Access by aspnet_wp.exe. At the end you will notice

 

“10172  5:27:39 AM       aspnet_wp.exe:5636      DELETE             D:\TempFileFolder\fileupload2.0\c45dc80b\4a2ce08b\uploads\rcrwfuj5.tmp  SUCCESS” which I believe is the buffered file which is deleted after it has been written to D:\uploads.

 

So if you run into a situation where there is not enough disk space on the default "C:\...." Drive as the C:\ drive is continuously accessed by your web app while users are uploading files, you can change the tempDirectory attribute to a different drive or path of your choice.