Мне нужна функция для загрузки файла больших данных на сервер в виде HTTP-загрузки с POST от внешнего поставщика услуг.в данный момент я использую следующую функцию weblient, и она работает с небольшими файлами:
_byteReturn = await _webClient.UploadDataTaskAsync(_url, File.ReadAllBytes(@"c:\tmp\test.zip"));
, но в этом случае существует проблема с границей 2 ГБ, а функция ReadAllBytes () считывает все байты в память.Конечно, я мог бы использовать другую функцию веб-клиента
_byteReturn = await _webClient.UploadFileTaskAsync(_url, @"c:\tmp\test.zip"));
, но с этой функцией я получаю HTTP-ошибку 400 от сервера.: / так что попробуйте использовать мой собственный код для загрузки.
using (WebClient _webClient = new WebClient())
{
_webClient.Headers[HttpRequestHeader.UserAgent] = "Test";
_webClient.Headers[HttpRequestHeader.CacheControl] = "no-cache";
_webClient.Headers[HttpRequestHeader.Authorization] = string.Format("Basic {0}", Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes("Username") + ":" + ("Password" )));
using (StreamWriter _output = new StreamWriter(await _webClient.OpenWriteTaskAsync(_url)))
{
_output.AutoFlush = true;
using (FileStream _fileStream = new FileStream(@"c:\tmp\install.esd", FileMode.Open, FileAccess.Read))
{
_bytesRead = 0;
_readByteBuffer = new byte[_bufferLength];
_bytesToRead = _fileStream.Length;
#if DEBUG
FileStream _testOutFileStream = new FileStream(_writeTestFileNameZip, FileMode.OpenOrCreate, FileAccess.ReadWrite);
#endif
do
{
_fileStream.Seek(_bytesRead, SeekOrigin.Begin);
_readCount = _fileStream.Read(_readByteBuffer, 0, _bufferLength);
_output.Write(_readByteBuffer);
#if DEBUG
if (_testOutFileStream != null)
{
_testOutFileStream.Write(_readByteBuffer, 0, _readCount);
_testOutFileStream.Flush();
}
#endif
_bytesRead += _readCount;
}
while (_readCount > 0);
#if DEBUG
if (_testOutFileStream != null)
_testOutFileStream.Dispose();
#endif
}
if (_output != null)
_output.Close();
}
}
пункт «ЭТО РАБОТАЕТ».Я не получаю ошибок во время загрузки и получаю правильный ответ от сервера после завершения загрузки, НО загрузка идет как чертовски быстро (загрузка 1 ГБ с 10 Мбит / с за 10 секунд).
Я считаю,это проблема с кешем, но я не уверен.кто знает в чем проблема?