是否可以与System.Net.Http.HttpClient一起使用持久连接?

时间:2013-08-27 18:27:58

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

我使用作为自托管进程运行的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创建持久连接的各种示例。它有一个KeepAlive属性,可以设置为true。有没有办法用HttpClient设置它?

MSDN documentation for HttpClient

  

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

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

MSDN文档还说:

  

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

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

2 个答案:

答案 0 :(得分:0)

我不确定你究竟想要解决的是什么,但你看过SignalR吗?他们拥有相当漂亮的websocket api,可以帮你完成你想要的工作。

如果您不使用.NET 4.5,那么他们确实有其他机制。我看到被使用的是服务器/事件流。

答案 1 :(得分:0)

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

ServicePointManager.MaxServicePointIdleTime = Timeout.Infinite;

您也可以在与特定终端

的连接上进行设置
var sp = ServicePointManager.FindServicePoint(targetUri);
sp.MasIdleTime = Timeout.Infinite;