【问题标题】:GET calls seem to be dropped using HttpClient似乎使用 HttpClient 丢弃了 GET 调用
【发布时间】:2011-12-03 19:34:04
【问题描述】:

我正在使用 WCF REST 预览版中的 HttpClient,我们看到了一些我正在尝试确定的奇怪功能。

发生的情况是,偶尔在对 RESTful Web 服务进行五种不同的 GET 调用之一时,调用似乎根本没有触发,但代码似乎认为它已经触发了。我们已经在服务端和发出请求的盒子上都进行了跟踪,当这个问题发生时,我们看不到任何传出请求。但是,代码会等待整个超时时间,然后会引发超时。我们已经运行了数百次测试,并且只在 GET 调用中看到它,而在我们的流程中也发生的 POST 调用中看不到。

更有趣的是,由于 Fiddler 在发出请求的盒子上运行,我们根本无法复制问题。所有请求每次都能顺利通过。

有人对可能发生的事情有任何想法吗?

更多信息: 所以我们重构了我们的调用,只使用 HttpWebRequest/HttpWebResponse 并将 HttpClient 排除在外,但仍然存在问题。我们已经为每个响应添加了明确的 .Close() 语句,因此我们似乎没有关闭它们。这是在 Microsoft CRM 异步插件中运行的,所以我也标记了它,以防万一这是 crm 的问题。

【问题讨论】:

    标签: wcf httpclient dynamics-crm fiddler dynamics-crm-2011


    【解决方案1】:

    由于您的代码在异步进程中的服务器上运行,它可能会用尽服务器上的传出 TCP 端口。当您有一个服务器端进程与其他 HTTP 服务器通信时,这很常见。

    这里有一个链接更详细地描述了这个问题,并展示了如何更新服务器上的注册表以优化这些设置。

    http://msdn.microsoft.com/en-us/library/ms819739.aspx

    【讨论】:

      【解决方案2】:

      问题确实是连接没有被关闭,并且远程服务器限制了与特定 IP 地址的连接数。事实证明,HttpClient 代码为每个实例创建了一个新的 ConnectionGroupName,而我们在每次调用时都创建了一个新的。即使我们将调用包装在 using 语句中,连接也没有关闭。

      我们在整个过程中使用 HttpWebRequest/HttpWebResponse 重写了代码,并在每次调用时显式调用了 .Close()。这已经解决了这个问题。

      我们猜测这些调用都是通过 Fiddler 进行的,因为它正在为我们关闭或汇集连接

      【讨论】:

      • 有没有办法为 HttpClient 或 HttpRequestMessage 的每个请求显式设置 ConnectionGroupName ?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 2022-12-11
      相关资源
      最近更新 更多