经过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;
}
}
下面是面临的错误:
附加错误信息:错误,请帮助我?
发布于 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
发布于 2020-02-24 10:57:44
我找到了一个答案:
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的问题。所以我创建了一个新的实例。我是个超级菜鸟!抱歉的!
https://stackoverflow.com/questions/60343344
复制相似问题