繁体   English   中英

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

[英]Is it possible to use persistent connections with System.Net.Http.HttpClient?

我已经使用作为自托管进程运行的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实例执行的请求隔离开。

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

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

如果您不使用.NET 4.5,则它们确实具有备用机制。 我见过使用过的服务器/事件流之类的东西。

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

ServicePointManager.MaxServicePointIdleTime = Timeout.Infinite;

您也可以在与特定端点的连接上进行设置

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM