2016-05-15 92 views
0

我上傳zip文件到Azure進行webjob時遇到了問題。WebClient的UploadFile上的大小限制

一切順利的時候壓縮文件大小小於10MB,但是要上傳大文件,我得到這個異常時:

流不支持併發IO讀或寫操作

堆棧:

  • 在System.Net.ConnectStream.InternalWrite(布爾異步,字節[]緩衝液,的Int32偏移量,大小的Int32,AsyncCallback的回調,對象狀態)
  • 在System.Net.ConnectStream.Write(字節[]緩衝液,的Int32偏移的Int32大小)
  • 在System.Net.WebClient.UploadBitsState.WriteBytes()
  • 在System.Net.WebClient.UploadBits(WebRequest的請求,流readStream,字節[]緩衝液,的Int32 CHUNKSIZE,字節[]報頭,字節[]頁腳,CompletionDelegate uploadCompletionDelegate,CompletionDelegate downloadCompletionDelegate,AsyncOperation asyncOp)
  • 在系統。 Net.WebClient.UploadFile(Uri地址,字符串方法,字符串文件名)

這裏是我的代碼:

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

其中MyWebClientWebClient,我需要設置超時的實現:

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

對將尺寸限制,可以是任何想法?我確定它是客戶端,並且不依賴於.Net Framework,因爲我測試了它們中的幾個。

編輯 的解決方案是通過鑄造的WebClient HttpWebRequest的要強制AllowWriteStreamBuffering爲false:

  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

您是否正在代碼中的其他地方重用WebClient? – Nasreddine

+0

@Nasreddine我沒有在其他地方使用客戶端 –

+0

@ ehsan-sajjad,這不是一個重複的問題,請在標記之前閱讀描述和解決方案 –

回答

1

這一行爲在此博客條目http://vikeed.blogspot.co.uk/2011/03/uploading-large-files-using-http-put-in.html這表明添加以下記錄;

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

一個相同的問題在這裏C# HttpClient PUT這表明使用AllowAutoRedirect = false將導致此錯誤公佈。

你可以嘗試修改你的設置,建議在這兩個類似的帖子,看看它是否糾正你的錯。

+0

這是正確的答案,我更新了我的WebClient的包裝器,將其轉換爲HttpWebRequest並設置AllowWriteStreamBuffering = false –