如何知道从哪一点触发HttpClient任务取消

时间:2018-11-02 05:54:24

标签: c# azure-webjobs dotnet-httpclient azure-authentication

我有以下代码来获取承载令牌,然后在c#应用程序中调用Web API。

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;
}

我在这里面临的问题是,有时,此代码有时会抛出异常,提示“任务已取消”,而并非每次都如此。我在网上搜索并遇到了this答案。因此,我检查了任务是否已取消。然后,如该答案所述,我将超时时间增加到30分钟。

现在奇怪的是,任务等待30分钟(或我们指定的任何超时),然后引发Task被取消的异常。这使我发疯。

我想知道为什么当我们不明确要求任务时为什么取消任务,以及取消任务的人或来源?有什么办法可以找到取消请求的来源吗?

在这方面的任何帮助都将受到高度赞赏,因为我无法找出问题所在。

尽管此处未提及,但请假定所有变量的值都正确。

编辑

异常消息:

  

任务被取消。

这是“异常堆栈跟踪”:

  

Exception StackTrace:位于   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()   在SampleProject.d__2.MoveNext()中   C:\ Users \ SampleProject \ HttpHelper.cs:第145行   ---从上一个引发异常的位置开始的堆栈跟踪---

0 个答案:

没有答案