2012-09-11 18 views

Respuesta

248

Así es como se podría definir 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 = client.PostAsync("/test", content).Result; 
    result.EnsureSuccessStatusCode(); 
} 
+0

manipulador se puede eliminar de la declaración de uso, se eliminará cuando se elimine el cliente http. – Kimi

+7

Kimi es correcta, pero tampoco debe envolver su HttpClient en un uso. http://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ – AdvancedREI

+3

PRECAUCIÓN: si utiliza solo 1 instancia de HttpClient para realizar varias solicitudes, las cookies que utilizan CookieContainer se almacenarán en caché. Es peligroso para un usuario obtener la cookie de otro usuario. –

211

El accepted answer es la forma correcta de hacer esto en la mayoría de los casos. Sin embargo, hay algunas situaciones en las que desea establecer manualmente el encabezado de la cookie. Normalmente, si configura un encabezado "Cookie", se ignorará, pero eso se debe a que HttpClientHandler usa de manera predeterminada su propiedad CookieContainer para las cookies. Si deshabilita eso, estableciendo UseCookies en false, puede establecer los encabezados de las cookies manualmente y estos aparecerán en la solicitud, p.

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

He estado persiguiendo durante varios días un error en el que las solicitudes enviadas con SendAsync no envió el encabezado de la cookie; esto me ayudó a darme cuenta de que, a menos que establezca UseCookies = false en el controlador, no solo usará el CookieContainer, sino que también ignorará _simplemente cualquier cookie almacenada en los encabezados de las solicitudes. Muchas gracias! –

+0

¡Gracias, eso es lo que quería! –

+7

¡Esta respuesta es extremadamente útil para cualquiera que intente utilizar HttpClient como un proxy! – cchamberlain

Cuestiones relacionadas