【问题标题】:Is it possible to use persistent connections with System.Net.Http.HttpClient?是否可以使用 System.Net.Http.HttpClient 的持久连接?
【发布时间】:2019-08-24 21:11:26
【问题描述】:

我使用作为自托管进程运行的 Web API 创建了 REST 资源。出于性能原因,我希望能够使用持久 HTTP 连接来调用它。我使用的是 OWIN 自托管。

我真的很喜欢 System.Net.Http.HttpClient 中用于 GET、POST、PUT、DELETE 的 asnyc 方法。它们很容易调用和处理——它们返回一个 System.Threading.Tasks.Task ,这对我正在尝试做的事情很方便。我更喜欢使用 HttpClient 而不是 System.Net.HttpWebRequest。

我可能遗漏了一些东西,但对我来说如何使用 HttpClient 创建持久连接并不明显。我正在研究 System.Net.Http.HttpClientHandler 和 System.Net.Http.WebRequestHandler 类,但到目前为止我还没有找到持久连接的选项。 Google 找到了各种使用 HttpWebRequest 创建持久连接的示例。它有一个可以设置为 true 的 KeepAlive 属性。有没有办法用 HttpClient 进行设置?

MSDN documentation for HttpClient:

默认情况下,HttpWebRequest 将用于向服务器发送请求。可以通过在将 HttpMessageHandler 实例作为参数的构造函数重载之一中指定不同的通道来修改此行为。如果需要身份验证或缓存等功能,可以使用 WebRequestHandler 来配置设置,并且可以将实例传递给构造函数。返回的处理程序可以传递给采用 HttpMessageHandler 参数的构造函数重载之一。

有没有办法在底层 HttpWebRequest 上设置 KeepAlive 功能?

MSDN 文档还说:

HttpClient 类实例充当发送 HTTP 请求的会话。 HttpClient 实例是应用于该实例执行的所有请求的设置集合。此外,每个 HttpClient 实例都使用自己的连接池,将其请求与其他 HttpClient 实例执行的请求隔离开来。

我是否可以从中理解,当可以获得性能优势时,连接池会使用持久连接为我优化?如果我希望客户端只有一个连接怎么办?

【问题讨论】:

  • 嗨!你终于知道它是否可能了吗?
  • 我已经有一段时间没有看到这个了。据我所知,这是不可能的。我尝试了很多东西,但无论我尝试什么,http.sys 都会在 120 秒后终止我的连接,因为它上面没有流量。我从未找到在 .NET 层配置连接以使用 HTTP KeepAlive 或其他任何东西来修改这种低级行为的方法。我很想有人回答。
  • 不,REST url 是无状态的,保持连接持久性会违反安全性。否则,您可以使用一个调用的凭据连接,并可能调用具有不同凭据的另一个 API。

标签: c# .net web-services rest asp.net-web-api


【解决方案1】:

您需要在客户端的 ServicePoint 上设置 MaxIdle 时间。最简单的方法是为所有服务点设置超时时间:

ServicePointManager.MaxServicePointIdleTime = Timeout.Infinite;

你也可以在到特定端点的连接上设置它

var sp = ServicePointManager.FindServicePoint(targetUri);
sp.MasIdleTime = Timeout.Infinite;

【讨论】:

    【解决方案2】:

    我不确定您到底要解决什么问题,但您看过 SignalR 吗?他们有非常漂亮的 websocket api,可以做你正在寻找的工作。

    如果您不使用 .NET 4.5,那么它们确实有替代机制。我见过使用的一种类似服务器/事件流的东西。

    【讨论】:

    • 我不确定为什么是 -1,但如果你听从我的建议,你可能会发现他们的 IHttpClient 实现很有趣。
    猜你喜欢
    • 2013-04-19
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多