Ожидание httpClient.GetByteArrayAsyn c () в HttpClient внезапно останавливается после того, как загружено много видео? - PullRequest
0 голосов
/ 21 февраля 2020

После 2-4 загрузки видео данных из API с помощью HttpClient неожиданно выдается ошибка. Вот мой код:

public async Task<byte[]> GetMedia(string id)
{
       var api = $"/api/v1/download/{id}";
       var Uri = $"{MccBaseURL}{api}";

       byte[] responseBody;
       httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("No");

       try
        {
            HttpResponseMessage response = await httpClient.GetAsync(Uri);
            response.EnsureSuccessStatusCode();

            responseBody = await response.Content.ReadAsByteArrayAsync();

            if (response.IsSuccessStatusCode)
            {
                return responseBody;
            }
        }
        catch (Exception ex)
        {
            Debug.Print(ex.Message);
            throw;
        }
}

Далее приведена ошибка:

enter image description here

Дополнительная информация об ошибке: Ошибка Пожалуйста, помогите мне?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

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

Однако наиболее вероятной проблемой является использование DefaultRequestHeaders. Вы должны использовать это только для заголовков, которые применяются к каждому запросу , который будет отправлять экземпляр HttpClient, а затем вы должны установить их только один раз , когда вы создаете клиента, как документация подразумевает («Заголовки, установленные в этом свойстве, не нужно снова устанавливать в сообщениях запроса»).

Хотя HttpClient по существу поточно-ориентирован, DefaultRequestHeaders ( и BaseAddress) свойства не являются. Вы изменяете эти значения, в то время как экземпляр клиента потенциально занят, используя их в другом месте. Неясно, используете ли вы синглтон HttpClient и в других местах, возможно, изменив там и заголовки по умолчанию, но если это так, это значительно увеличит шансы возникновения проблем.


Некоторые дополнительные ссылки о ненарезной безопасности этих свойств:

https://github.com/dotnet/dotnet-api-docs/issues/1085

http://www.michaeltaylorp3.net/httpclient-is-it-really-thread-safe/

https://github.com/MicrosoftDocs/architecture-center/issues/935

0 голосов
/ 24 февраля 2020

Я нашел ответ:

public async Task<bool> GetMedia(string saveDir, string id)
        {
            var api = $"/api/v1/download/{id}";
            var Uri = $"{MccBaseURL}{api}";
            using (HttpClient client = new HttpClient())
            {
                using (HttpResponseMessage response = await client.GetAsync(Uri, HttpCompletionOption.ResponseHeadersRead))
                using (System.IO.Stream streamToReadFrom = await response.Content.ReadAsStreamAsync())
                {
                    string fileToWriteTo = System.IO.Path.GetTempFileName();
                    using (System.IO.FileStream streamToWriteTo = new System.IO.FileStream(saveDir, System.IO.FileMode.Create))
                    {
                        await streamToReadFrom.CopyToAsync(streamToWriteTo);
                        return true;
                    }
                }
            }
        }

Это была действительно проблема с памятью, которая постоянно использовала один и тот же HttpClient снова и снова. Итак, я создал новый экземпляр. Я супер нуб! Извините!

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