首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在下载了许多视频后,HttpClient中的等待httpClient.GetByteArrayAsync()突然停止了?

在下载了许多视频后,HttpClient中的等待httpClient.GetByteArrayAsync()突然停止了?
EN

Stack Overflow用户
提问于 2020-02-21 17:06:42
回答 2查看 2.8K关注 0票数 0

经过2-4下载视频数据从API使用HttpClient突然提示错误.这是我的密码:

代码语言:javascript
运行
复制
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;
        }
}

下面是面临的错误:

附加错误信息:错误,请帮助我?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-25 07:39:04

首先,您应该处理您的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

票数 1
EN

Stack Overflow用户

发布于 2020-02-24 10:57:44

我找到了一个答案:

代码语言:javascript
运行
复制
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的问题。所以我创建了一个新的实例。我是个超级菜鸟!抱歉的!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60343344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档