Note that there are some explanatory texts on larger screens.

plurals
  1. POHttpWebRequest FileUpload causes OutOfMemoryException
    primarykey
    data
    text
    <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>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload