Я работаю над проектом, написанным C # на .NET Core 2.2.В моем коде мне нужно загрузить большой файл (около 2 ГБ) на удаленный HTTP-сервер.
Я не отвечаю за удаленный сервер.Я отвечаю только за логику загрузки.
Каков наилучший способ загрузки большого локального файла через HTTP в C #?
Я пробовал следующий код
https://github.com/AiursoftWeb/Nexus/blob/master/Pylon/Services/HTTPService.cs#L66-L81
public async Task<string> PostFile(string url, string filepath)
{
var request = new HttpClient();
var form = new MultipartFormDataContent();
string responseString = null;
using (var fileStream = new FileStream(filepath, mode: FileMode.Open))
{
using (var bufferedStream = new BufferedStream(fileStream))
{
form.Add(new StreamContent(bufferedStream), "file", new FileInfo(filepath).FullName);
var response = await request.PostAsync(url, form);
responseString = await response.Content.ReadAsStringAsync();
fileStream.Close();
}
}
return responseString;
}
Я не смог найти ни одной ошибки в этом коде, и он работает с небольшими файлами.(Около 500 МБ)
Но при загрузке большого файла размером около 2 ГБ возникла исключительная ситуация:
Операция была отменена.Ошибка при копировании контента в поток.Невозможно получить доступ к удаленному объекту.Имя объекта: 'SslStream'.
Я предполагаю, что поток был удален во время загрузки.
Я ожидаю, что весь мой файл может быть успешно загружен на удаленный сервер, и процесс не будетсъесть большую часть моей оперативной памяти.Так что не так с моим кодом?Есть ли какой-нибудь пример для меня?
Дополнительная информация:
Я посмотрел журнал вышестоящего HTTP-сервера и показал, что соединение было прервано удаленным клиентом.И соединение длилось 1,7 минуты, прежде чем оно было закрыто.
В журнале говорится:
Существующее соединение было принудительно закрыто удаленным хостом. Существующее соединение было принудительно закрыто удаленным хостом.