我的团队维护一个工具,负责对1000多个不同的客户端网站进行快速验证。该工具是一个Windows服务(.NET 4.5.2,C#),它从队列读取请求,并为每个请求执行“健康检查”。它通常每分钟处理500多个请求,但可以负责更多。每个请求需要一两秒才能执行。使用HttpClient C对许多不同网站的快速Web请求#
请求包含执行健康检查所需的Uri
和凭据。健康检查是针对具有凭证的AUTH页面的POST
(应用程序具有自定义身份验证,它不是基于标头的身份验证),然后是主页上的GET
,并快速验证它是我们期望的主页。然后进入应用程序中的状态页面,并对其进行一些快速检查。 GET请求必须使用来自验证帖子中Set-Cookie标头的cookie。
我们一直在使用该工具进行缩放时遇到性能问题。它目前会为每个帖子创建一个新的HttpWebRequest
对象并进入该过程。有一个共享CookieContainer由第一篇文章填充,以便我们可以进入主页,然后进入状态页面。
我想要更改此服务,以使用.NET 4.5中提供的HttpClient
对象。这个问题无处不在,我在网上阅读说,你想避免HttpClients
快速创建和销毁。您宁愿让一个实例在应用程序的整个生命周期中保持活跃状态。我遇到的问题是HttpClient
似乎对一个终端非常有效,并不是很多。
我已经看过成几个选项,我不知道这是最好进行:
- 为每个请求创建一个新的
HttpClient
,并将其用于该请求的持续时间。这意味着它会活几秒钟,并用于3个电话。这不易实现,但我担心一分钟内创建并销毁数百个HttpClients
的开销。 - 找出是否有可能通过避免使用
BaseAddres
s,并使用SendAsync
来通过HttpRequestMessages
来为不同端点使用一个HttpClient
实例。我还没有能够找出用这种方法的饼干。为了避免在编辑:cookies工作正常,因为它们存储在每个域。HttpClient
店的饼干,我设置UseCookies
为false在HttpClientHandler
,并试图通过头在HttpRequest
/ResponseMessages
管理Cookie本身,但它看起来当UseCookies
设置为false
像HttpClient
简单地剥离饼干,所以我无法在请求之间传递Cookie。 - 将几百个不同的
HttpClient
实例存储在某种字典中,并在请求进入时为每个Uri
拉出相应的实例。但我不确定这种内存开销。另外每个独特的Uri
仅每5分钟验证一次,所以我不确定是否每5分钟使用一次HttpClient
就会使不必要数量的端口打开。 - 继续使用
HttpWebRequests
。也许这种旧方法在这种情况下仍然表现更好。
如果有人遇到过类似的问题,我很乐意就此进行处理。
谢谢!
为什么你不想存储cookie?从原来的描述来看,它几乎听起来像是你想重用它们,以便我们可以进入主页,然后进入状态页面。 – Colin
@Colin - 我们将同时对几十个网站运行并行请求。这些网站中的每一个都是同一个应用程序的不同实例,因此所有的cookie名称都是相同的。我不确定HttpClient的一个实例如何处理它。如果我对客户端A进行认证,然后客户端B转到获取状态页面,它会使用刚才在共享CookieContainer中设置的客户端A的Cookie吗?那会造成一些怪异。 – aalkema
你可以使用一个HttpClient每个网站? – Colin