¿Cómo configuro una cookie en HttpRequestMessage de HttpClient?
Estoy intentando utilizar las API web HttpClient
para 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
?
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();
}
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 HttpClientHandler
predeterminada se usa su CookieContainer
propiedad para las cookies. Si lo desactiva, al configurarlo UseCookies
puede false
configurar 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();
}
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);
}
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.cs
y 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
IHttpClientFactory
en su controlador o middleware. - Crea tu cliente
using var client = clientFactory.CreateClient("MyNamedClient");