2017-01-03 34 views
0

http投稿でファイルをアップロードします。以下の方法は、私がOutOfMemoryExceptionsSystem.Net.WebClientでファイルをアップロード中にOutOfMemoryExceptionが発生しました

を得る1ギガバイト>ファイルで正常に動作しますが、私はいくつかのsolutionsAllowWriteStreamBufferingSystem.Net.WebRequestに基づいていますが、それは私がSystem.Net.WebClientでそれを解決する必要があるため、この場合にも助けていないようです。

例外がスローされた自分のアプリケーションのメモリ使用量は〜500メガバイトについて常にある

私はこのエラーを回避するために変更する必要が何
string file = @"C:\test.zip"; 
string url = @"http://foo.bar"; 
using (System.Net.WebClient client = new System.Net.WebClient()) 
{ 
    using (System.IO.Stream fileStream = System.IO.File.OpenRead(file)) 
    { 
     using (System.IO.Stream requestStream = client.OpenWrite(new Uri(url), "POST")) 
     { 
      byte[] buffer = new byte[16 * 1024]; 
      int bytesRead; 
      while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       requestStream.Write(buffer, 0, bytesRead); 
      } 
     } 
    } 
} 

+0

を拡張するのに役立ちますあなたは(https://msdn.microsoft.com/en-us [WebClient.UploadFileAsync]を使用して考えがあります/library/ms144232(v=vs.110).aspx)? –

+0

インストールされているマルウェア対策製品を文書化する必要があるような質問。また、管理されていないデバッグが有効なスタックトレースを表示します。 –

答えて

1

1日後、私はこの問題の解決策を見つけました。

多分これは、いくつかの将来の訪問者

string file = @"C:\test.zip"; 
string url = @"http://foo.bar"; 
using (System.IO.Stream fileStream = System.IO.File.OpenRead(file)) 
{ 
    using (ExtendedWebClient client = new ExtendedWebClient(fileStream.Length)) 
    { 
     using (System.IO.Stream requestStream = client.OpenWrite(new Uri(url), "POST")) 
     { 
      byte[] buffer = new byte[16 * 1024]; 
      int bytesRead; 
      while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       requestStream.Write(buffer, 0, bytesRead); 
      } 
     } 
    } 
} 

WebClient方法

private class ExtendedWebClient : System.Net.WebClient 
{ 
    public long ContentLength { get; set; } 
    public ExtendedWebClient(long contentLength) 
    { 
     ContentLength = contentLength; 
    } 

    protected override System.Net.WebRequest GetWebRequest(Uri uri) 
    { 
     System.Net.HttpWebRequest hwr = (System.Net.HttpWebRequest)base.GetWebRequest(uri); 
     hwr.AllowWriteStreamBuffering = false; //do not load the whole file into RAM 
     hwr.ContentLength = ContentLength; 
     return (System.Net.WebRequest)hwr; 
    } 
} 
関連する問題