2016-05-15 3 views
0

У меня возникла проблема при загрузке zip-файла в Azure для веб-дизайна.Ограничение по размеру для UploadFile WebClient

Все идет хорошо, когда размер почтового индекса файла меньше 10 МБ, однако при попытке загрузить файлы большего размера, я получаю это исключение:

Поток не поддерживает одновременную IO операции чтения или записи

Стек:

  • в System.Net.ConnectStream.InternalWrite (Boolean асинхронном, байт [] буфера, 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, метод String, String fileName)

Вот мой код:

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

где MyWebClient является реализацией WebClient, где мне нужно, чтобы установить тайм-аут:

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

Любой идею о том, где ограничение размера может быть? Я уверен, что это клиентская сторона и не зависит от .NET Framework, поскольку я тестировал несколько из них.

РЕДАКТИРОВАТЬ Решение было заставить AllowWriteStreamBuffering к ложным путем отливки WebClient к HttpWebRequest:

  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 который предполагает добавление следующего; здесь C# HttpClient PUT, который указывает, что использование AllowAutoRedirect = false вызовет эту ошибку

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

Идентичный проблема была опубликована.

Вы можете попробовать изменить свои настройки, как предложено в этих двух похожих сообщениях, и посмотреть, исправляет ли он вашу ошибку.

+0

Это правильный ответ, я обновил мою обертку для WebClient, чтобы передать ее в HttpWebRequest и установите AllowWriteStreamBuffering = false –

Смежные вопросы