池化的 HttpClient 实例是否保留 CookieContainer?

Vac*_*ano 11 c# dotnet-httpclient asp.net-core httpclientfactory

这个答案展示了如何向 HttpClient 请求添加 cookie。但其中一条评论警告说,该内容CookieContainer已缓存在 HttpClient 上。我的大部分 cookie 不应再次发送给其他用户。

我希望能够清除池中 HttpClient 实例中添加的HttpClientFactory内容。CookieContainer

HttpClient如果我通过电话得到我的,httpClientFactory.CreateClient是否有可能我收到的邮件CookieContainer上有以前的内容?

更新:

我的问题的答案是肯定的! CookieContainer适用于当您想在每次调用时发送相同的 cookie 时。

如果您需要在每次调用时发送不同的 cookie,有多种方法可以实现。但最简单的方法是将其放在标题中。

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

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

Kir*_*kin 12

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

官方文档中有一节解释了自动 cookie 处理并IHttpClientFactory不能很好地协同工作:

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

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

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

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


Tod*_*ier 5

CookieContainer在我看来,紧密耦合的事实HttpClient是一个主要的设计缺陷,因为它不允许您在模拟多个 cookie“会话”时(正确地)使用后者的单个实例。正如所指出的,HttpClientFactory并不能解决这个问题 - 您仍然坚持要么放弃CookieContainer并自己处理原始标头,要么拥有HttpClient比您真正需要的更多的实例。

我最近用 Flurl作为 3.0 中的一个主要新功能解决了这个问题。如果您不介意库依赖性,那么这一切都HttpClient在幕后,但它替换CookieContainer为类似的概念 ( CookieJar),支持相同的自动 cookie 处理,但使单客户端/多会话场景成为可能。