2016-05-15 3 views
0

Beim Hochladen einer Zip-Datei in Azure für einen Webjob ist ein Problem aufgetreten.Größenbeschränkung für UploadFile des WebClients

Alles geht gut, wenn die ZIP-Datei Größe als 10 MB weniger ist jedoch, wenn größere Dateien zu versuchen, bekomme ich diese Ausnahme:

Der Strom nicht gleichzeitig IO unterstützt Lese- oder Schreiboperationen

Stack:

  • bei System.Net.ConnectStream.InternalWrite (Boolean async, Byte [] Puffer, Int32 Offset-, Int32 Größe, AsyncCallback Rückruf, Objektzustand)
  • bei System.Net.ConnectStream.Write (Byte [] Puffer, Int32 Offset, Int32 size)
  • bei System.Net.WebClient.UploadBitsState.WriteBytes()
  • bei System.Net.WebClient.UploadBits (WebRequest Anfrage, Stream Readstream, Byte [] Puffer, Int32 chunkSize, Byte [] Header, Byte [] footer, CompletionDelegate uploadCompletionDelegate, CompletionDelegate downloadCompletionDelegate, AsyncOperation asyncOp)
  • bei System. Net.WebClient.UploadFile (Uri-Adresse, String-Methode, String fileName)

Hier ist mein Code:

var client = new MyWebClient 
{ 
    Credentials = new NetworkCredential(webSite.UserName, webSite.Password),     
}; 
client.Headers.Add(HttpRequestHeader.ContentType, "application/zip"); 
client.Headers.Add("Content-Disposition", $"attachment; filename={appFile}"); 

var response = client.UploadFile(uploadUri, "PUT", filePath); 

wo MyWebClient ist eine Implementierung von WebClient, wo ich das Timeout einstellen müssen:

private class MyWebClient : WebClient 
{ 
    protected override WebRequest GetWebRequest(Uri uri) 
    { 
     WebRequest w = base.GetWebRequest(uri); 
     w.Timeout = 20 * 60 * 1000; 
     return w; 
    } 
} 

Jede Idee, wo die Größenbeschränkung sein kann? Ich bin sicher, es ist Client-Seite und nicht abhängig von. Net Framework, wie ich mit mehreren von ihnen getestet.

EDIT Die Lösung wurde durch AllowWriteStreamBuffering auf false zu zwingen WebClient zu HttpWebRequest Gießen:

  protected override WebRequest GetWebRequest(Uri uri) 
      { 
       WebRequest w = base.GetWebRequest(uri); 
       w.Timeout = 20 * 60 * 1000; 
       var httpRequest = w as HttpWebRequest; 
       if (httpRequest != null) 
       { 
        httpRequest.AllowWriteStreamBuffering = false; 
       } 
       return w; 
      } 
+0

Verwenden Sie den WebClient an anderer Stelle in Ihrem Code erneut? – Nasreddine

+0

@Nasreddine Ich benutze den Client nirgendwo sonst –

+0

@ ehsan-sajjad, das ist keine doppelte Frage, lesen Sie bitte die Beschreibung und Lösung, bevor Sie es markieren –

Antwort

1

Dieses Verhalten in diesem Blog-Eintrag dokumentiert http://vikeed.blogspot.co.uk/2011/03/uploading-large-files-using-http-put-in.html die Zugabe der folgenden schlägt;

HttpWebRequest request = new ... 
request.AllowWriteStreamBuffering = false; 

Ein identisches Problem wurde hier C# HttpClient PUT geschrieben, die das AllowAutoRedirect = false mit anzeigt wird diesen Fehler verursachen.

Sie können versuchen, Ihre Einstellungen zu ändern, wie in diesen beiden ähnlichen Posts vorgeschlagen, und sehen, ob es Ihren Fehler korrigiert.

+0

Es ist die richtige Antwort, ich habe meinen Wrapper für WebClient auf HttpWebRequest umgewandelt und setze AllowWriteStreamBuffering = false –