2017-01-03 5 views
0

Je souhaite télécharger un fichier avec http post. La méthode suivante fonctionne très bien, mais avec des fichiers> 1 Go je reçois un OutOfMemoryExceptionsOutOfMemoryException lors du chargement de fichier avec System.Net.WebClient

J'ai trouvé quelques solutions basé sur AllowWriteStreamBuffering et System.Net.WebRequest, mais cela ne semble pas aider à être dans ce cas parce que je dois résoudre avec System.Net.WebClient.

L'utilisation de la mémoire de mon application lorsque l'exception est levée est toujours de ~ 500Mo

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); 
      } 
     } 
    } 
} 

Que dois-je changer pour éviter cette erreur?

+0

Avez-vous pensé à utiliser [WebClient.UploadFileAsync] (https://msdn.microsoft.com/en-us /library/ms144232(v=vs.110).aspx)? –

+0

Des questions comme celles-ci doivent documenter le produit anti-programme malveillant installé. Et afficher une trace de pile avec le débogage non géré activé. –

Répondre

1

Après 1 jour d'essai, j'ai trouvé une solution à ce problème.

Peut-être que cela aidera certains futurs visiteurs

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); 
      } 
     } 
    } 
} 

Extended WebClient méthode

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; 
    } 
}