首页 > 解决方案 > 池化的 HttpClient 实例是否保留 CookieContainer?

问题描述

答案显示如何将 cookie 添加到 HttpClient 请求。但是其中一条评论警告说CookieContainer缓存在 HttpClient 上。我的大部分 cookie 不应再次发送给其他用户。

我希望HttpClientFactory清除CookieContainer它的池中的 HttpClient 实例之类的东西。

如果我HttpClient通过电话得到我的,我得到的httpClientFactory.CreateClient是否有可能有一个以前CookieContainer的?

更新:

我的问题的答案是肯定的! CookieContainer适用于您希望在每次通话中发送相同的 cookie 时。

如果您需要在每次调用时发送不同的 cookie,有几种方法可以做到这一点。但最简单的是将它放在标题中。

因为客户端的每个请求HttpClientFactory都会创建一个新HttpClient的,所以您可以添加到客户端的标头中,而不必担心它会重用 cookie。

这样做的关键是设置UseCookies。它必须设置为 false,否则您添加到标头的 cookie 将被忽略。完成此操作后,您可以将 cookie 添加到“Cookies”键下的标题中,并将它们作为分号分隔的键值对输入(它们之间使用等号)。您的 cookie 在标题“Set-Cookies”中返回。

标签: c#asp.net-coredotnet-httpclienthttpclientfactory

解决方案


HttpMessageHandler是被汇集的实例;不是HttpClient实例。默认情况下,处理程序的生命周期为 2 分钟,这意味着a可能会在多个sCookieContainer之间共享。HttpClient

官方文档中有一个部分,它解释了自动 cookie 处理和IHttpClientFactory不能很好地协同工作:

池化的HttpMessageHandler实例导致CookieContainer对象被共享。意外CookieContainer的对象共享通常会导致错误的代码。对于需要 cookie 的应用程序,请考虑:

  • 禁用自动 cookie 处理
  • 避免IHttpClientFactory

调用ConfigurePrimaryHttpMessageHandler以禁用自动 cookie 处理:

services.AddHttpClient("configured-disable-automatic-cookies")
    .ConfigurePrimaryHttpMessageHandler(() =>
    {
        return new SocketsHttpHandler()
        {
            UseCookies = false,
        };
    });

推荐阅读