Поведение Mimic CookieContainer с переоснащением - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь использовать Refit для замены существующего класса-обертки HttpClient, который я написал некоторое время назад.В большинстве случаев все работает довольно хорошо, но есть один случай, когда мне нужно передать cookie вместе с моим запросом.Я полагаю, что часть моего замешательства заключается в том, что я не знаю, куда именно попадают файлы cookie при использовании HttpClientHandler CookieContainer.

Это код установки cookie, который я пытаюсь имитировать:

var handler = new HttpClientHandler();
handler.CookieContainer = new CookieContainer();
handler.CookieContainer.SetCookies(new Uri(endPoint), cookieString);

var httpClient = new HttpClient(handler);
var response = await httpClient.PutAsync(endPoint, jsonContent);

Когда я перехожу через этот код, я не вижу, что cookie помещается в заголовок, и я изо всех сил пытаюсьувидеть его где-нибудь в заголовке запроса / ответе / значениях и т. д.

Как мне повторить это с помощью Refit?Я попытался поместить его в заголовок (который работает, он входит в заголовок), но это не то, что, кажется, делает CookieContainer, поэтому он не работает.

1 Ответ

0 голосов
/ 17 июня 2019

По сути, вы бы поступили так же.

RestService.For<T>() имеет переопределение, которое принимает предварительно сконфигурированный HttpClient, поэтому вы инициализируете это с HttpClientHandler, в котором находится ваш контейнер cookie.

Вот пример:

using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Refit;

class Program
{
    static async Task Main(string[] args)
    {
        // Your base address is the same for cookies and requests
        var baseAddress = new Uri("https://httpbin.org");

        // Set your cookies up in the cookie container of an HttpClientHandler
        var handler = new HttpClientHandler();
        handler.CookieContainer.Add(baseAddress, new Cookie("C", "is for cookie"));

        // Use that to create a new HttpClient with the same base address
        var client = new HttpClient(handler) { BaseAddress = baseAddress };

        // Pass that client to `RestService.For<T>()`
        var httpBin = RestService.For<IHttpBinApi>(client);

        var response = await httpBin.GetHeaders();

        Console.WriteLine(response);
    }
}

public interface IHttpBinApi
{
    // This httpbin API will echo the request headers back at us
    [Get("/headers")]
    Task<string> GetHeaders();
}

Вывод выше:

{
  "headers": {
    "Cookie": "C=is for cookie",
    "Host": "httpbin.org"
  }
}
...