Hoe stel ik een cookie in op HttpClient’s HttpRequestMessage

Ik probeer de HttpClientvan de web-api te gebruiken om een ​​bericht te plaatsen op een eindpunt waarvoor aanmelding vereist is in de vorm van een HTTP-cookie die een account identificeert (dit is alleen iets dat #ifdef‘uit de releaseversie).

Hoe voeg ik een cookie toe aan de HttpRequestMessage?


Antwoord 1, autoriteit 100%

Hier ziet u hoe u een aangepaste cookiewaarde voor het verzoek kunt instellen:

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 = await client.PostAsync("/test", content);
    result.EnsureSuccessStatusCode();
}

Antwoord 2, autoriteit 94%

Het geaccepteerde antwoordis in de meeste gevallen de juiste manier om dit te doen. Er zijn echter enkele situaties waarin u de cookie-header handmatig wilt instellen. Als u een “Cookie”-header instelt, wordt deze normaal gesproken genegeerd, maar dat komt omdat HttpClientHandlerstandaard de eigenschap CookieContainergebruikt voor cookies. Als u dat uitschakelt, kunt u, door UseCookiesin te stellen op false, cookie-headers handmatig instellen en deze verschijnen in het verzoek, bijvoorbeeld

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();
}

Antwoord 3

Na uren aan dit probleem te hebben besteed, heeft geen van de bovenstaande antwoorden me geholpen, dus vond ik een echt nuttig hulpmiddel.

Ten eerste gebruikte ik Fiddler 4 van Telerik om mijn webverzoeken in detail te bestuderen

Ten tweede kwam ik deze handige plug-in voor Fiddler tegen:

https://github.com/sunilpottumuttu/FiddlerGenerateHttpClientCode

Het genereert alleen de C#-code voor u. Een voorbeeld was:

       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;

Merk op dat ik twee regels van commentaar moest voorzien, omdat deze plug-in nog niet helemaal perfect is, maar desondanks deed het zijn werk.

DISCLAIMER: ik ben hoe dan ook niet geassocieerd of onderschreven door Telerik of de auteur van de plug-in.


Antwoord 4

Voor mij werkt de eenvoudige oplossing om cookies in te stellen in het HttpRequestMessage-object.

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);
}

Antwoord 5

Ik had een soortgelijk probleem en voor mijn AspNetCore 3.1-toepassing werkten de andere antwoorden op deze vraag niet. Ik ontdekte dat het configureren van een HttpClient met de naam in mijn Startup.csen het gebruik van header-propagatie van de Cookie-header perfect werkte. Het vermijdt ook alle zorgen over de juiste instelling van uw handler en klant. Let op als verspreiding van de verzoekcookies niet is wat u nodig heeft (sorry Op), u kunt uw eigen cookies instellen bij het configureren van de clientfabriek.

Services configureren met IServiceCollection

services.AddHttpClient("MyNamedClient").AddHeaderPropagation();
services.AddHeaderPropagation(options =>
{
    options.Headers.Add("Cookie");
});

Configureren met IApplicationBuilder

builder.UseHeaderPropagation();
  • Injecteer de IHttpClientFactoryin uw controller of middleware.
  • Maak uw client using var client = clientFactory.CreateClient("MyNamedClient");

Other episodes