Можно ли настроить HttpClient, чтобы не сохранять куки? - PullRequest
2 голосов
/ 03 апреля 2019

У меня есть простой Asp.Net Core WebApi, где я использую HttpClient для отправки некоторых веб-запросов custum. Я использую 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 заголовке. Он добавляет эти куки в последовательные заголовки 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 не добавлять куки?

Это происходит только в том же сеансе, поэтому, если я выберу HttpClient, файлы cookie не будут добавлены. Но утилизация HttpClient может привести к другим проблемам.

1 Ответ

6 голосов
/ 03 апреля 2019

См. HttpClientHandler.UseCookies.

Получает или задает значение, указывающее, использует ли обработчик свойство CookieContainer для хранения файлов cookie сервера и использует эти файлы cookie при отправке запросов.

Итак, вам нужно сделать:

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

Если вы используете HttpClientFactory в ядре asp.net, то этот ответ предполагает, что способ сделать это:

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