Как загрузить большой файл в другой HTTP-сервис, используя C #? - PullRequest
0 голосов
/ 22 апреля 2019

Я работаю над проектом, написанным 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 минуты, прежде чем оно было закрыто.

В журнале говорится:

Существующее соединение было принудительно закрыто удаленным хостом. Существующее соединение было принудительно закрыто удаленным хостом.

1 Ответ

0 голосов
/ 22 апреля 2019

Я обнаружил проблему: время ожидания по умолчанию для клиента HTTP составляет 100 секунд. Исходный код здесь:

https://github.com/dotnet/corefx/blob/master/src/System.Net.Http/src/System/Net/Http/HttpClient.cs#L17

И я изменил свой код так:

        public async Task<string> PostFile(string url, string filepath)
        {
            var request = new HttpClient
            {
                Timeout = TimeSpan.FromSeconds(3600)
            };
            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;
        }

И проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...