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

C# 是否可以使用System.Net.Http.HttpClient的持久连接?,c#,.net,web-services,rest,asp.net-web-api,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 我可能遗漏了一些东西,但我并不

我已经使用作为自托管进程运行的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设置这个

:

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

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

MSDN文档还指出:

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


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

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


如果您没有使用.NET4.5,那么它们确实有其他机制。所使用的一个I'v类似于服务器/事件流。

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

ServicePointManager.MaxServicePointIdleTime = Timeout.Infinite;
您还可以在与特定端点的连接上设置它

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

我不知道为什么会使用-1,但是如果您遵循我的建议,您可能会发现他们的IHttpClient实现很有趣。嗨!你最终发现这是否可能了吗?我已经有一段时间没有看到这个了。据我所知,这是不可能的。我尝试了很多方法,但无论我尝试了什么,http.sys都会在120秒后终止我的连接,因为它没有流量。我从未找到在.NET层配置连接的方法,以使用HTTP KeepAlive或其他任何东西修改这种低级行为。我希望有人能给出答案。不,REST URL是无状态的,保持连接的持久性将违反安全性。否则,您可以使用一个调用的凭据进行连接,并可能调用另一个具有不同凭据的API。