我的 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;
}
上面的代码在大多数情况下都可以正常工作。但偶尔它会抛出一个异常,说“任务已取消”。因此,根据一些问题和文章,我发现这可能有两个原因。
- 请求超时。
- 或者请求实际上被取消了。
我已经检查过这个变量:CancellationToken.IsCancellationRequested
。它返回错误。所以我假设这是超时问题。为了确定这个超时,我还检查了请求启动和抛出异常之间的时间差。正好是 100 秒(这是 httpClient 的默认时间)。
现在,当我在 5-10 秒后立即重试相同的请求时,它会返回成功。由于并非每个请求都会出现此问题,因此我对发生的情况感到有点困惑。
相同的请求执行成功的次数为 95%,其余次数为 5%,它表示任务已取消。
是否存在同一个Task执行一次并取消一次的场景。
我已通过 Postman 发送 Web API 请求,但收到此问题后就没有发送请求。我只能通过 Windows 应用程序面对这个问题。
我有什么遗漏的吗?
Edit
内部异常为空。
堆栈跟踪:位于
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在
System.Net.Http.HttpClient.d__58.MoveNext()
--- 从先前抛出异常的位置开始的堆栈跟踪结束 --- at
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()