【问题标题】:Why is first HttpClient.PostAsync call extremely slow in my C# winforms app?为什么我的 C# winforms 应用程序中的第一个 HttpClient.PostAsync 调用非常慢?
【发布时间】:2016-01-29 12:38:23
【问题描述】:

我有一个这样的httpclient:

var client = new HttpClient();

我是这样发帖的:

var result = client.PostAsync(
                endpointUri,
                requestContent);

得到这样的响应:

HttpResponseMessage response = result.Result;

我知道这个调用会阻塞线程,这就是它应该如何工作(只是为我自己构建一个工具,不需要异步线程)

我第一次运行此调用时,大约需要 2 分钟才能获得结果。同时,如果我在其他地方进行完全相同的调用,它会在 200 毫秒内完成。即使我点击谷歌,也需要 2 分钟。但是,在第一次通话之后,只要我保持应用程序打开,任何额外的通话都是好的。当我打开应用程序时,它只是第一次调用。这可能是什么原因造成的?

【问题讨论】:

  • 我会首先使用.ContinueWith 而不是.Result(使用async/await...)——除此之外,我看不出任何可能导致延迟的东西,老实说,我怀疑问题出在其他地方
  • 如果我们有一个堆栈来查看这将很容易。使用 new WebClient().DownloadString() 进行测试,在暂停期间暂停调试器并发布包括外部代码的调用堆栈。它可能说明了有关 DNS 或代理的内容。
  • 我无法开始猜测,但我会首先排除同步执行此问题的可能性。 HttpClient 被设计为仅是异步的,并且对于以阻塞方式使用它有强烈的警告。 await resultresult.Result 一样简单,为什么要拒​​绝正确使用呢?

标签: c# winforms dotnet-httpclient


【解决方案1】:

问题是它在尝试为客户端解析代理时挂了很长时间。像这样初始化 HttpClient 就成功了:

var client = new HttpClient(new HttpClientHandler
            {
                UseProxy = false
            });

【讨论】:

  • 非常感谢您的回答。对于 Get 请求,我遇到了同样的问题。
  • 我遇到了类似的问题,第二次尝试需要 40 毫秒并由提琴手测量的请求需要 1-2.5 秒(考虑到请求的长度非常大),甚至是第一次使用 HttpClient 的新实例。设置 UseProxy = false 没有帮助。
  • 我遇到了同样的问题,即使使用 proxy = false,第一次很慢,第一次之后在一分钟内很快。仅针对特定网址,其他网址则不然。任何人都有另一个建议。 @蒂莫西冈萨雷斯
  • 我也遇到了同样的问题,谁能帮帮我们?
  • 一段时间以来一直在用这个搞砸我的脑袋。有人解决了吗? @Marinpietri 运气好吗?将代理设置为 false 并不能解决特定 URL 的问题,但端点在邮递员中测试时会立即响应。
【解决方案2】:

就我而言,我试图访问localhost 上的服务。显然,HTTP 客户端先尝试连接到 IPv6 本地主机,然后再连接到其 IPv4 等效项(来源:https://github.com/jchristn/restwrapper),这会导致速度变慢。

在我的例子中,将 localhost 更改为 127.0.0.1 会减少 2000 毫秒的延迟,尽管第一个请求可能仍有约 120 毫秒的延迟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多