gpt4 book ai didi

c# - HttpClient 请求有时在 C# 中失败

转载 作者:行者123 更新时间:2023-11-30 18:13:15 30 4
gpt4 key购买 nike

我的 C# Windows 应用程序中有类似的代码。

public async Task<HttpResponseMessage> SendHttpRequest()
{
HttpResponseMessage response = null;
try
{
HttpClient client = new HttpClient();
string accessToken = await GetBearerToken(resourceUrl, clientId, clientSecret, tokenProviderUrl);
if (!string.IsNullOrEmpty(accessToken))
httpRequest.Headers.Add("Authorization", ("Bearer " + accessToken));

response = await client.SendAsync(httpRequest);
}
catch(Exception ex)
{
log.Error("Exception raised while sending HTTP request");
log.Error("Exception details : " + ex.Message);
}

return response;
}

public async Task<string> GetBearerToken()
{
HttpResponseMessage response = null;
HttpClient client = new HttpClient();
string token = "";
try
{
var request = new HttpRequestMessage(HttpMethod.Post, tokenProviderUrl);
request.Content = new FormUrlEncodedContent(new Dictionary<string, string> {
{ "client_id",clientId},
{ "client_secret", clientSecret },
{ "grant_type", "client_credentials" },
{ "resource", resource },
});

response = await client.SendAsync(request);
var payload = JObject.Parse(await response.Content.ReadAsStringAsync());
token = payload.Value<string>("access_token");
}
catch (HttpRequestException ex)
{
log.Error("Error in GetToken : " + ex.Message.ToString());
}
return token;
}

上面的代码在大多数情况下都工作得很好。但偶尔它会抛出一个异常,说“任务被取消”。所以根据几个问题和文章,我发现这可能有两个原因。

  1. 请求超时。
  2. 或者请求实际上被取消了。

我检查了这个变量:CancellationToken.IsCancellationRequested。它返回错误。所以我假设这是超时问题。基于这个超时,我还检查了请求开始和异常抛出之间的时间差。正好是 100 秒(这是 httpClient 的默认时间)。

现在,当我在 5-10 秒后立即重试相同的请求时,它返回成功。由于并非每个请求都会出现此问题,所以我对发生的事情有点困惑。

相同的请求成功执行了 95% 的次数,剩下 5% 的次数,它表示任务已取消。

有没有同一个Task执行一次取消一次的场景。

我已经通过 Postman 发送了对 Web API 的请求,但我收到这个问题后就没有了。我只能通过 Windows 应用程序来面对这个问题。

有什么我遗漏的吗?

编辑

内部异常为空。

Stack Trace : atSystem.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Tasktask) atSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Tasktask) atSystem.Net.Http.HttpClient.d__58.MoveNext()--- End of stack trace from previous location where exception was thrown --- atSystem.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Tasktask) atSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Tasktask) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()

最佳答案

您不应该在每次要发布时都创建一个新的 HttpClient。在您的主要方法中创建一个新的 HttpClient 并将其传递给您“发送 HttpRequest”。我在取消任务时遇到了类似的问题,所以我搜索了一些并使用了它。它对我有用

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
client.DefaultRequestHeaders.Add("Keep-Alive", "false");
client.Timeout = TimeSpan.FromMinutes(20);

关于c# - HttpClient 请求有时在 C# 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53150544/

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