【发布时间】: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