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处理:
Run Code Online (Sandbox Code Playgroud)services.AddHttpClient("configured-disable-automatic-cookies") .ConfigurePrimaryHttpMessageHandler(() => { return new SocketsHttpHandler() { UseCookies = false, }; });
CookieContainer在我看来,紧密耦合的事实HttpClient是一个主要的设计缺陷,因为它不允许您在模拟多个 cookie“会话”时(正确地)使用后者的单个实例。正如所指出的,HttpClientFactory并不能解决这个问题 - 您仍然坚持要么放弃CookieContainer并自己处理原始标头,要么拥有HttpClient比您真正需要的更多的实例。
我最近用 Flurl作为 3.0 中的一个主要新功能解决了这个问题。如果您不介意库依赖性,那么这一切都HttpClient在幕后,但它替换CookieContainer为类似的概念 ( CookieJar),支持相同的自动 cookie 处理,但使单客户端/多会话场景成为可能。
| 归档时间: |
|
| 查看次数: |
4322 次 |
| 最近记录: |