title: HttpWebRequest FileUpload causes OutOfMemoryException
body: <p>I always get this <code>OutOfMemoryException</code>:</p>
  
  <pre><code> System.OutOfMemoryException was not handled.
   Message=Exception of type 'System.OutOfMemoryException' was thrown.
   Source=System
   StackTrace:
      at System.Net.ScatterGatherBuffers.AllocateMemoryChunk(Int32 newSize)
      at System.Net.ScatterGatherBuffers.Write(Byte[] buffer, Int32 offset, Int32 count)
      at System.Net.ConnectStream.InternalWrite(Boolean async, Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
      at System.Net.ConnectStream.Write(Byte[] buffer, Int32 offset, Int32 size)
      …
  </code></pre>
  
  <p>... and memory usage is steadily increasing (according to the Windows task manager) when I execute following source code:</p>
  
  <pre><code>Imports System.Net
  Imports System.Text
  Imports System.IO
  
  Public Class HttpFileUploader
  
      Public Function uploadFile(ByVal containa As CookieContainer, ByVal uri As String, ByVal filePath As String, ByVal fileParameterName As String, ByVal contentType As String, ByVal otherParameters As Specialized.NameValueCollection) As String
  
          Dim boundary As String = "---------------------------" &amp; DateTime.Now.Ticks.ToString("x")
          Dim newLine As String = System.Environment.NewLine
          Dim boundaryBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(newLine &amp; "--" &amp; boundary &amp; newLine)
          Dim request As Net.HttpWebRequest = Net.WebRequest.Create(uri)
  
          request.ContentType = "multipart/form-data; boundary=" &amp; boundary
          request.Method = "POST"
          request.CookieContainer = containa
          request.AllowAutoRedirect = True
          request.Timeout = -1
  
          Using requestStream As IO.Stream = request.GetRequestStream()
  
              Dim formDataTemplate As String = "Content-Disposition: form-data; name=""{0}""{1}{1}{2}"
  
              For Each key As String In otherParameters.Keys
  
                  requestStream.Write(boundaryBytes, 0, boundaryBytes.Length)
                  Dim formItem As String = String.Format(formDataTemplate, key, newLine, otherParameters(key))
                  Dim formItemBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(formItem)
                  requestStream.Write(formItemBytes, 0, formItemBytes.Length)
  
              Next key
  
              requestStream.Write(boundaryBytes, 0, boundaryBytes.Length)
  
              Dim headerTemplate As String = "Content-Disposition: form-data; name=""{0}""; filename=""{1}""{2}Content-Type: {3}{2}{2}"
              Dim header As String = String.Format(headerTemplate, fileParameterName, filePath, newLine, contentType)
              Dim headerBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(header)
              requestStream.Write(headerBytes, 0, headerBytes.Length)
  
              Using fileStream As New IO.FileStream(filePath, IO.FileMode.Open, IO.FileAccess.Read)
  
                  Dim buffer(4096) As Byte
                  Dim bytesRead As Int32 = fileStream.Read(buffer, 0, buffer.Length)
  
                  Do While (bytesRead &gt; 0)
                      ' the exception is triggered by the following line:     
                      requestStream.Write(buffer, 0, bytesRead)
                      bytesRead = fileStream.Read(buffer, 0, buffer.Length)
                  Loop
  
              End Using
  
              Dim trailer As Byte() = System.Text.Encoding.ASCII.GetBytes(newLine &amp; "--" + boundary + "--" &amp; newLine)
              requestStream.Write(trailer, 0, trailer.Length)
              requestStream.Close()
  
          End Using
  
          Dim response As Net.WebResponse = Nothing
          Dim responseText = ""
  
          Try
  
              response = request.GetResponse()
  
              Using responseStream As IO.Stream = response.GetResponseStream()
  
                  Using responseReader As New IO.StreamReader(responseStream)
  
                      responseText = responseReader.ReadToEnd()
  
                  End Using
  
              End Using
  
          Catch exception As Net.WebException
  
              MsgBox(exception.Message)
  
          Finally
  
              response.Close()
              response = Nothing
              request = Nothing
  
          End Try
  
          Return responseText
  
      End Function
  
  End Class
  </code></pre>
  
  <p>I have marked with a comment the line that triggers the exception.</p>
  
  <p>I'm using 10 threads for uploading different files (having sizes up to 250 MB).</p>
  
  <p>Why am I running out of memory with this code?</p>