2012-10-24 6 views
2

我使用下面的代碼將大文件上傳到服務器,並注意到將FileStream複製到GetRequestStream的bytes數組被創建並保存在內存中。這增加了大對象堆,我不想要它。也許有人知道如何解決這個問題?WebRequest.GetRequestStream和LOH

Stream formData = new FileStream(.....) 

    HttpWebRequest request = WebRequest.Create(postUrl) as HttpWebRequest; 
    using (Stream requestStream = request.GetRequestStream()) 
    {    
    Helpers.CopyStream(formData, requestStream); 
    requestStream.Close(); 
    } 

    public static void CopyStream(Stream fromStream, Stream toStream) 
      { 
       try 
       { 
        int bytesRead; 
        byte[] buffer = new byte[32768]; 
        while (fromStream != null && (bytesRead = fromStream.Read(buffer, 0, buffer.Length)) > 0) 
        { 
         toStream.Write(buffer, 0, bytesRead); 
        } 
       } 
       catch (IOException) 
       { 
        //suppress empty stream response 
       } 
      } 

Memory profiler graph。字節數組中GetRequestStream

Memory profiler graph. bytes array create internally in GetRequestStream

內部創建
+0

那是字節數組一個你傳遞給它,或請求流的內部實例? –

+0

字節數組與我傳遞的文件大小相同。 – Tomas

回答

2

可以使用HttpWebRequest.AllowWriteStreamBuffering禁用內部緩衝:

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 

    request.AllowWriteStreamBuffering = false; 

    using (Stream formData = File.Open(fileName, FileMode.Open)) 
    using (Stream requestStream = request.GetRequestStream()) 
    { 
     formData.CopyTo(requestStream, 32768); 
    } 
+0

不要有任何區別,仍然是大對象的問題。如果您將查看內存分析器圖形,您會發現在複製流之後會創建字節數組。 – Tomas

+0

我想我找到了一個解決方案:'HttpWebRequest.AllowWriteStreamBuffering' ... MSDN表示默認值爲true。你可以禁用它看看會發生什麼。 –

+0

這工作,AllowWriteStreamBuffering做的工作! :) – Tomas

相關問題