gpt4 book ai didi

c# - HttpClient in using 语句导致任务取消

转载 作者:太空狗 更新时间:2023-10-29 17:39:03 29 4
gpt4 key购买 nike

我为我的 api 调用创建了一个 FileResult : IHttpActionResult webapi 返回类型。 FileResult 从另一个 url 下载文件,然后将流返回给客户端。

最初我的代码有一个 using 语句,如下所示:

public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
try
{
HttpResponseMessage response;
using (var httpClient = new HttpClient())
{

response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new System.Net.Http.StreamContent(
await httpClient.GetStreamAsync(this.filePath))
};
}
return response;
}
catch (WebException exception)
{...}
}

但是这会间歇性地导致 TaskCanceledException。我知道如果在异步调用完成之前处理 HttpClient,则任务的状态将更改为已取消。但是,由于我在 Content = new System.Net.Http.StreamContent(await httpClient.GetStreamAsync(this.filePath)) 中使用了 await,这应该可以防止 HttpClient 被在任务完成的中间处理掉。

为什么该任务被取消?这不是因为超时,因为这发生在最小的请求上,并不总是发生在大的请求上。

当我删除 using 语句时,代码可以正常工作:

public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
try
{
HttpResponseMessage response;
var httpClient = new HttpClient();

response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new System.Net.Http.StreamContent(
await httpClient.GetStreamAsync(this.filePath))
};
return response;
}
catch (WebException exception)
{...}
}

知道使用导致问题的原因吗?

最佳答案

I know that if the HttpClient is disposed before the asychronous call is finished the Task's state will change to canceled. However since I use an await in: Content = new System.Net.Http.StreamContent(await httpClient.GetStreamAsync(this.filePath)) that should prevent the HttpClient from being disposed off in the middle of the task completion.

但是该任务做什么?它获取流。因此,您的代码以 Stream 结束,当它关闭 HttpClient 时,它可能会或可能不会被完全读取。

HttpClient 专为重用(和同时使用)而设计,因此我建议完全删除 using 并将 HttpClient 声明移至static 类成员。但是,如果您想关闭并重新打开客户端,您应该能够通过在关闭 HttpClient 之前将流完全读入到内存中来使其正常工作。

关于c# - HttpClient in using 语句导致任务取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33095737/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com