Как установить cookie на HttpClient HttpRequestMessage

Я пытаюсь использовать веб-api HttpClient для публикации сообщения в конечной точке, требующей входа в форму HTTP файла cookie, который идентифицирует учетную запись (это только то, что #ifdef "из релиз).

Как добавить файл cookie в HttpRequestMessage?

Ответ 1

Здесь вы можете установить настраиваемое значение cookie для запроса:

var baseAddress = new Uri("http://example.com");
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
    var content = new FormUrlEncodedContent(new[]
    {
        new KeyValuePair<string, string>("foo", "bar"),
        new KeyValuePair<string, string>("baz", "bazinga"),
    });
    cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
    var result = client.PostAsync("/test", content).Result;
    result.EnsureSuccessStatusCode();
}

Ответ 2

принятый ответ - это правильный способ сделать это в большинстве случаев. Однако есть некоторые ситуации, когда вы хотите вручную настроить заголовок cookie. Обычно, если вы устанавливаете заголовок "Cookie", он игнорируется, но потому, что HttpClientHandler по умолчанию использует свойство CookieContainer для файлов cookie. Если вы отключите это, то, установив UseCookies в false, вы можете настроить заголовки файлов cookie вручную, и они появятся в запросе, например.

var baseAddress = new Uri("http://example.com");
using (var handler = new HttpClientHandler { UseCookies = false })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
    var message = new HttpRequestMessage(HttpMethod.Get, "/test");
    message.Headers.Add("Cookie", "cookie1=value1; cookie2=value2");
    var result = await client.SendAsync(message);
    result.EnsureSuccessStatusCode();
}

Ответ 3

Потратив несколько часов на эту проблему, ни один из приведенных выше ответов не помог мне, поэтому я нашел действительно полезный инструмент.

Во-первых, я использовал Telerik Fiddler 4 для подробного изучения своих веб-запросов

Во-вторых, я наткнулся на этот полезный плагин для Fiddler:

https://github.com/sunilpottumuttu/FiddlerGenerateHttpClientCode

Он просто сгенерирует код С# для вас. Пример был:

        var uriBuilder = new UriBuilder("test.php", "test");
        var httpClient = new HttpClient();


        var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, uriBuilder.ToString());



        httpRequestMessage.Headers.Add("Host", "test.com");
        httpRequestMessage.Headers.Add("Connection", "keep-alive");
     //   httpRequestMessage.Headers.Add("Content-Length", "138");
        httpRequestMessage.Headers.Add("Pragma", "no-cache");
        httpRequestMessage.Headers.Add("Cache-Control", "no-cache");
        httpRequestMessage.Headers.Add("Origin", "test.com");
        httpRequestMessage.Headers.Add("Upgrade-Insecure-Requests", "1");
    //    httpRequestMessage.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
        httpRequestMessage.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36");
        httpRequestMessage.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
        httpRequestMessage.Headers.Add("Referer", "http://www.translationdirectory.com/");
        httpRequestMessage.Headers.Add("Accept-Encoding", "gzip, deflate");
        httpRequestMessage.Headers.Add("Accept-Language", "en-GB,en-US;q=0.9,en;q=0.8");
        httpRequestMessage.Headers.Add("Cookie", "__utmc=266643403; __utmz=266643403.1537352460.3.3.utmccn=(referral)|utmcsr=google.co.uk|utmcct=/|utmcmd=referral; __utma=266643403.817561753.1532012719.1537357162.1537361568.5; __utmb=266643403; __atuvc=0%7C34%2C0%7C35%2C0%7C36%2C0%7C37%2C48%7C38; __atuvs=5ba2469fbb02458f002");


        var httpResponseMessage = httpClient.SendAsync(httpRequestMessage).Result;

        var httpContent = httpResponseMessage.Content;
        string result = httpResponseMessage.Content.ReadAsStringAsync().Result;

Обратите внимание, что мне пришлось закомментировать две строки, так как этот плагин еще не совсем совершенен, но, тем не менее, справился.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не связан и не одобрен ни Telerik, ни автором плагина в любом случае.

Ответ 4

Для меня это простое решение - установить файлы cookie в объекте HttpRequestMessage.

protected async Task<HttpResponseMessage> SendRequest(HttpRequestMessage requestMessage, CancellationToken cancellationToken = default(CancellationToken))
{
    requestMessage.Headers.Add("Cookie", $"<Cookie Name 1>=<Cookie Value 1>;<Cookie Name 2>=<Cookie Value 2>");

    return await _httpClient.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false);
}