是否可以将 HttpClient 配置为不保存 cookie?

Posted

技术标签:

【中文标题】是否可以将 HttpClient 配置为不保存 cookie?【英文标题】:Is it possible to configure HttpClient not to save cookies? 【发布时间】:2019-04-03 11:10:07 【问题描述】:

我有一个简单的Asp.Net Core WebApi,我使用HttpClient 发送一些自定义网络请求。我像这样使用HttpClient

services.AddHttpClient<IMyInterface, MyService>()
...

public class MyService : IMyInterface

    private readonly HttpClient _client;

    public MyService(HttpClient client)
    
        _client = client;
     

    public async Task SendWebRequest()
    
        var url = "https://MyCustomUrl.com/myCustomResource";
        var request = new HttpRequestMessage(HttpMethod.Get, url);
        var response = await _client.SendAsync(request);
        ...
    
   

我注意到,当我发送多个请求时,HttpClient 会在 Set-Cookie 标头中保存它收到的第一个 response cookie。它将这些 cookie 添加到连续的 request 标头中。 (我已经用fiddler 对此进行了检查)。流程:

//First requst
GET https://MyCustomUrl.com/myCustomResource HTTP/1.1

//First response
HTTP/1.1 200 OK
Set-Cookie: key=value
...

//Second request
GET https://MyCustomUrl.com/myCustomResource HTTP/1.1
Cookie: key=value

//Second response
HTTP/1.1 200 OK
...

有没有办法强制HttpClient 不添加cookie?

这只会发生在同一个会话中,所以如果我要处理 HttpClient 则不会添加 cookie。但是处理HttpClient 可能会带来一些其他问题。

【问题讨论】:

【参考方案1】:

HttpClientHandler.UseCookies

获取或设置一个值,该值指示处理程序是否使用 CookieContainer 属性来存储服务器 cookie 并在发送请求时使用这些 cookie。

所以你需要这样做:

var handler = new HttpClientHandler()  UseCookies = false ;
var httpClient = new HttpClient(handler);

如果您在 asp.net core 中使用HttpClientFactory,那么this answer 建议这样做的方法是:

services.AddHttpClient("configured-inner-handler")
    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler()  UseCookies = false );

【讨论】:

这如何与 asp.net core DI 一起工作?我不想手动创建 HttpClient 实例,因为这是一种很好的做法。如果手动创建它并且也可以处理它,这将丢弃所有 cookie @Ramūnas 更新

以上是关于是否可以将 HttpClient 配置为不保存 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

Redis 立即保存到磁盘,即使配置为不

是否可以将 CSS 选择器中的重要属性值设为不重要的属性值?

如何将网页打印为不分页的pdf

使用 HttpClient,如何将 XDocument 直接保存到请求流中?

将 Git 客户端(如 GitHub for Windows)配置为不要求身份验证

是否可以为不活动实现自动注销功能?