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

pet*_*snd 8 .net c# rest web-services 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设置它?

HttpClient的MSDN文档:

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

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

MSDN文档还说:

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

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

Dev*_*per 1

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

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