HttpClient请求有时在c#中失败

问题描述 投票:3回答:1

我在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%的时间,它说任务被取消了。

是否存在一次执行相同任务并取消一次的任何情况。

我已通过邮递员发送Web API请求,而不是我收到此问题。只有通过Windows应用程序,我才面对这个。

有什么我想念的。非常感谢任何帮助。谢谢

编辑

内部异常为空。

堆栈跟踪:System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务),位于System.Net.Http.HttpClient.d__58.MoveNext()的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中---结束来自抛出异常的先前位置的堆栈跟踪---位于System.Runtime.CompilerServices.TaskAwaiter上的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务),System.Runtime.CompilerServices.TaskAwaiter`1上的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) .GetResult()

c# httpclient azure-webjobs
1个回答
0
投票

你不应该每次想要发布一个新的HttpClient。在main方法中创建一个新的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);
© www.soinside.com 2019 - 2024. All rights reserved.