9

我使用作为自托管进程运行的 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 设置它?

HttpClient 的 MSDN 文档

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

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

MSDN 文档还说:

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

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

4

2 回答 2

3

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

ServicePointManager.MaxServicePointIdleTime = Timeout.Infinite;

您还可以在与特定端点的连接上设置它

var sp = ServicePointManager.FindServicePoint(targetUri);
sp.MasIdleTime = Timeout.Infinite;
于 2015-01-11T22:41:41.743 回答
1

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

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

于 2013-08-27T20:41:13.867 回答