¿Cómo configuro una cookie en HttpRequestMessage de HttpClient?

Resuelto George Mauer asked hace 12 años • 7 respuestas

Estoy intentando utilizar las API web HttpClientpara realizar una publicación en un punto final que requiere iniciar sesión en forma de una cookie HTTP que identifica una cuenta (esto es solo algo que se#ifdef elimina de la versión de lanzamiento).

¿Cómo agrego una cookie al HttpRequestMessage?

George Mauer avatar Sep 11 '12 23:09 George Mauer
Aceptado

A continuación se explica cómo puede establecer un valor de cookie personalizado para la solicitud:

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();
}
Darin Dimitrov avatar Sep 11 '2012 16:09 Darin Dimitrov

La respuesta aceptada es la forma correcta de hacer esto en la mayoría de los casos. Sin embargo, hay algunas situaciones en las que desea configurar el encabezado de la cookie manualmente. Normalmente, si configura un encabezado "Cookie", se ignora, pero eso se debe a que de forma HttpClientHandlerpredeterminada se usa su CookieContainerpropiedad para las cookies. Si lo desactiva, al configurarlo UseCookiespuede falseconfigurar los encabezados de cookies manualmente y aparecerán en la solicitud, por ejemplo

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();
}
Greg Beech avatar Nov 08 '2012 10:11 Greg Beech

Para mí, la solución simple funciona para configurar cookies en el objeto 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);
}
Waqar UlHaq avatar Aug 19 '2019 20:08 Waqar UlHaq

Tuve un problema similar y para mi aplicación AspNetCore 3.1 las otras respuestas a esta pregunta no funcionaban. Descubrí que configurar un HttpClient con nombre en mi Startup.csy usar la propagación del encabezado del encabezado Cookie funcionó perfectamente. También evita todas las preocupaciones sobre la disposición adecuada de su manejador y cliente. Tenga en cuenta que si la propagación de las cookies de solicitud no es lo que necesita (lo siento, Op), puede configurar sus propias cookies al configurar la fábrica del cliente.

  • Utilicé esta guía de Microsoft: realizar solicitudes HTTP utilizando IHttpClientFactory en ASP.NET Core
  • La propagación de encabezados se trata en esta sección: Middleware de propagación de encabezados

Configurar servicios conIServiceCollection

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

Configurar conIApplicationBuilder

builder.UseHeaderPropagation();
  • Inyecte el IHttpClientFactoryen su controlador o middleware.
  • Crea tu clienteusing var client = clientFactory.CreateClient("MyNamedClient");
KevM avatar Oct 01 '2020 14:10 KevM