Как мне установить cookie на объектами httprequestmessage HttpClient, который по



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



как добавить куки в HttpRequestMessage?

701   3  

3 ответов:

вот как вы можете установить пользовательское значение 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();
}

The принято отвечать - это правильный способ сделать это в большинстве случаев. Однако, есть некоторые ситуации, где вы хотите установить заголовок 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();
}

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

во-первых, я использовал из Telerik скрипач 4 изучить мой веб-запросов в подробности

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

https://github.com/sunilpottumuttu/FiddlerGenerateHttpClientCode

Он будет просто генерировать код C# для вас. Например:

        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, ни автором плагина в любом случае.

Comments

    Ничего не найдено.