是否可以将 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?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以将 CSS 选择器中的重要属性值设为不重要的属性值?
使用 HttpClient,如何将 XDocument 直接保存到请求流中?