我的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
。它返回false。所以我假设这是超时问题。为了使此超时成为基础,我还检查了启动请求和引发异常之间的时间差。恰好是100秒(这是httpClient的默认时间)。
现在,当我在5到10秒后立即重试相同的请求时,它会返回成功。由于并不是每个请求都出现此问题,所以我对正在发生的事情感到有些困惑。
同一请求成功执行了95%,其余5%成功,它表示Task已取消。
是否存在同一任务执行一次并取消一次的情况。
我已经通过邮递员发送了关于Web API的请求,但是没有收到此问题。我只能通过Windows应用程序来解决这个问题。
我有什么想念的吗。我们非常感谢您的帮助。谢谢
编辑
内部异常为null。
堆栈跟踪:位于 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) System.Net.Http.HttpClient.d__58.MoveNext() ---从上一个引发异常的位置开始的堆栈跟踪- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务),位于System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
答案 0 :(得分:0)
您不应该在每次发布时都新建一个HttpClient。 在您的主要方法中创建一个新的HttpClient,并将其传递给您 “ SendHttpRequest”。 我在取消任务时也遇到了类似的问题,因此我搜索了一些问题并使用了它。 它对我有用
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);