httpclient.postasyn c - System.ObjectDisposedException: невозможно получить доступ к удаленному объекту - PullRequest
0 голосов
/ 24 марта 2020

У меня есть функция загрузки файла. Я загружаю файл кусками, он пытается загрузить чанк, при неудачном входе пытается войти снова и затем пытается загрузить. На некоторых файлах он работает нормально, а на некоторых нет (нет согласованности в отношении того, какие файлы заканчиваются ошибкой, а какие загружаются - один и тот же файл один раз работает, а другой нет).

ошибка, которую я получаю в функции загрузки файла:

System.ObjectDisposedException: Невозможно получить доступ к удаленному объекту. Имя объекта: 'System. Net .Http.MultipartFormDataContent'. в System. Net .Http.HttpContent.CheckDisposed () в System. Net .Http.HttpContent.CopyToAsyn c (потоковый поток, контекст TransportContext) в System. Net .Http.HttpClientHandler.GetRequestStreamCallback ( ar) --- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача задачи) в системе. Runtime.CompilerServices.TaskAwaiter`1.GetResult () в

Функция:

private bool uploadFile(string path, ref string fileName)
        {

            var chunkSize = 1024 * 1024;
            var identifier = Guid.NewGuid();
            using (var fileStream = File.OpenRead(path))
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
                var count = 1;
                var totalChunkCount = Math.Ceiling((double)fileStream.Length / chunkSize);
                HttpResponseMessage response = null;
                while (fileStream.Position < fileStream.Length)
                {
                    var readCount = fileStream.Length - fileStream.Position > chunkSize
                        ? chunkSize
                        : (int)(fileStream.Length - fileStream.Position);
                    var buffer = new byte[readCount];
                    fileStream.Read(buffer, 0, readCount);
                    using (var chunkedStream = new MemoryStream(buffer))
                    {
                        using (var content = new MultipartFormDataContent())
                        {
                            content.Add(new StreamContent(chunkedStream),
                                Path.GetFileNameWithoutExtension(path), Path.GetFileName(path));
                            content.Add(new StringContent(count.ToString()), "ChunkNumber");
                            content.Add(new StringContent(totalChunkCount.ToString()), "TotalChunks");
                            content.Add(new StringContent(identifier), "Identifier");
                            content.Add(new StringContent(Path.GetFileName(path)), "Filename");

                            response = client.PostAsync(m_uploadURL, content).GetAwaiter().GetResult();
                            if (!response.IsSuccessStatusCode && response.StatusCode == HttpStatusCode.Unauthorized)
                            {
                                login();
                                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
                                response = client.PostAsync(m_uploadURL, content).GetAwaiter().GetResult();
                            }
                        }
                    }
                    ShowPercentProgress("Upload of  " + path, count, Convert.ToInt32(totalChunkCount));
                    count++;
                }

                if (response != null)
                {
                    var contents = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
                    var json = JObject.Parse(contents);
                    var uploadResponse = json.ToObject<UploadResponse>();
                    if (!uploadResponse.status.isSuccess)
                    {
                        Logger.Log("Error: " + uploadResponse.status.statusDescription);
                        return false;
                    }
                    if (uploadResponse.data.allChunksUploaded)
                    {
                        serverFileName = uploadResponse.data.fileName;
                        return true;
                    }
                }
            }

            return false;
        }

Не удалось найти ответ по net

1 Ответ

0 голосов
/ 25 марта 2020

Var содержимое в скобках. И вы используете postbasyn c. Поэтому он вызывается асинхронно, когда он выходит из области видимости, объект содержимого автоматически удаляется. Попробуйте

                   var content = new MultipartFormDataContent():

                        content.Add(new StreamContent(chunkedStream),
                            Path.GetFileNameWithoutExtension(path), Path.GetFileName(path));
                        content.Add(new StringContent(count.ToString()), "ChunkNumber");
                        content.Add(new StringContent(totalChunkCount.ToString()), "TotalChunks");
                        content.Add(new StringContent(identifier), "Identifier");
                        content.Add(new StringContent(Path.GetFileName(path)), "Filename");

Удалить используя.

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