C# 中的 HttpClient 请求有时会失败

2024-01-08

我的 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 应用程序面对这个问题。

我有什么遗漏的吗?

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()


你不应该每次想发帖时都创建一个新的 HttpClient 。 在你的 main 方法中创建一个新的 HttpClient 并将其传递到你的 “发送Http请求”。 我在任务取消方面遇到了类似的问题,所以我搜索了一些并使用了这个。 这对我有用

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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中的 HttpClient 请求有时会失败 的相关文章

随机推荐

  • 检查数据库连接,否则显示消息

    我想检查该网站是否可以连接到 mySQL 如果没有 我想显示一个错误 指出用户应该在几分钟内尝试再次访问该页面 我真的不知道该怎么做 任何帮助将不胜感激 string mysql error resource link identifier
  • 使用 firebug 查找 JavaScript 中的内存泄漏?

    是否有适用于 Firefox 的附加组件可以用来找出部分 JavaScript 导致内存泄漏的情况 我对 Firefox 没有任何了解 但 Chrome 中的 webkit 检查器有一个内置的分析器 非常适合此类事情 作为一个额外的好处 它
  • 在Python中加载大文件

    我正在使用在 Ubuntu 9 04 上运行的 Python 2 6 2 GCC 4 3 3 我需要使用 Python 脚本逐行读取一个大数据文件 1GB gt 300 万行 我尝试了以下方法 发现它占用了很大的内存空间 3GB for l
  • 正则表达式,匹配不带“http://”和任何其他“/”的 url

    我环顾四周 但可能我无法使用正确的关键字 谷歌 所以我在这里 我需要将 url 剥离协议与第一个 相匹配 Target 匹配从 http 到第一个 可能是最后一个 不存在 或到结尾的第一个子字符串 那么问题来了 我写了这个正则表达式 但这个
  • 预定义类型“System.Runtime.CompilerServices.IsExternalInit”未定义或导入[重复]

    这个问题在这里已经有答案了 我在使用 Visual Studio 2019 Preview 测试 C 9 0 的新功能时一直遇到这个问题 我正在测试 init setter 但编译器显示错误并显示以下消息 错误 CS0518 未定义或导入预
  • 通过 Exchange EWS API 批准电子邮件

    我遇到一种情况 我需要将邮件重新路由到另一个作为主持人的邮箱 以编程方式 有没有办法批准我在主持人邮箱中收到的消息 我没有看到 EWS 对此有明确的支持 微软还有其他 API 类型支持这个吗 这不是官方批准的方式 但以下解决方法可以帮助我批
  • jQuery 增量读取 AJAX 流?

    我读过了这个问题 https stackoverflow com questions 6093103 jquery ajax display data as it comes in但它并不能完全回答我的问题 不幸的是 自从我上次查看 AJA
  • 找不到类型或命名空间 AppServiceConnection

    我无法找到在新计算机上编译的解决方案 该解决方案包含一个与控制台应用程序打包在一起的 UWP 应用程序 UWP 应用程序通过以下方式与控制台应用程序进行通信应用服务连接 https learn microsoft com en us uwp
  • 覆盖moment js默认的无效日期文本

    我如何覆盖 moment js var defaultInvalidDate Invalid date 无需更改 moment js 文件 就像我的网站使用 Site css 覆盖某些 bootstrap css 样式一样 所以当 boot
  • 使用 SFINAE 检测 C++ 中类型的 POD 性

    这里原来的标题是VS2005 C 中 SFINAE 错误的解决方法 这是暂时使用 SFINAE 来等效 TR1 中存在的 is pod 模板类 在 VS2005 中还没有 TR1 应该有它的value当模板参数是 POD 类型 包括基本类型
  • Ansible SSH 转发似乎不适用于 Vagrant

    好吧 奇怪的问题 我有 SSH 转发与 Vagrant 一起使用 但我试图在使用 Ansible 作为 Vagrant 配置程序时让它工作 我准确地找到了 Ansible 正在执行的内容 并亲自从命令行尝试了它 果然 它也失败了 commo
  • 需要有关 Twitter 小部件的帮助

    我创建了一个 jquery 插件 它在左侧放置一个侧边栏以显示社交媒体内容 我有下面的变量 它是内容的来源 我正在尝试使用该小部件拉入 twitter feed 但我不断收到错误 TWTR 未定义 任何想法如何解决这一问题 该页面正在调用我
  • 使用 Swift 转义 unicode 字符,即 \u1234

    在 xcode 6 中使用 JSON 和 swift 时 我遇到特殊字符问题 我在 Cocoa objective C 中找到了这些代码来解决一些转换重音的问题 但无法使其在 Swift 中工作 关于如何使用它有什么建议吗 最好的替代建议也
  • Logstash 索引文本文件

    我想在 Elasticsearch 中导入一个文本文件 该文本文件每行包含 3 个值 经过几个小时的努力 我还是没有完成 非常感谢您的帮助 安装了 Logstash 的 Elasticsearch 5 4 0 样本数据 username e
  • 如何仅在第一次调用模拟方法时抛出异常?

    我有一个可以多次调用的模拟对象的方法 想想递归 该方法定义如下 public void doCommit 为了让它失败 我使用这个约定 doThrow new RuntimeException when mMockedObject doCo
  • 如何强制单表继承的引用完整性?

    我读过一些比尔 卡尔文的 https stackoverflow com users 20860 bill karwin回答关于单表继承 https stackoverflow com questions 441001 possible t
  • 为什么从类到子类的动态转换要求类是多态的?

    据我了解 动态转换与静态转换的不同之处在于它对 RTTI 的使用 并且如果变量的动态类型 从基类转换为派生类时 不适合 则动态转换会失败 但是 如果我们无论如何都有 RTTI 为什么类必须是多态的才能完成呢 编辑 由于对 多态 一词的使用存
  • 用于触摸 ID 和密码设置的 iOS 首选项 url 方案

    iOS 设置应用程序有很多带有首选项 url 的列表 用于在设置应用程序中打开特定站点 例如https stackoverflow com a 8246814 4266294 https stackoverflow com a 824681
  • JSPDF 在本地保存的文件在 Acrobat 中出现文档 [110] 错误

    我有以下 JavaScript 代码https jsfiddle net d72sgwrc 5 https jsfiddle net d72sgwrc 5 假设要保存屏幕图像 将其转换为 Canvas 并将其保存为 PDF 将文件下载到本地
  • C# 中的 HttpClient 请求有时会失败

    我的 C Windows 应用程序中有类似的代码 public async Task