c# cookies httpwebrequest webclient cookiecontainer

c# - Uso de CookieContainer con clase WebClient



cookies httpwebrequest (5)

Anteriormente utilicé un CookieContainer con las sesiones HttpWebRequest y HttpWebResponse, pero ahora quiero usarlo con un WebClient. Por lo que yo entiendo, no hay un método incorporado como existe para HttpWebRequests ( request.CookieContainer ). ¿Cómo puedo recopilar cookies de un WebClient en un CookieContainer?

googled en googled esto y encontré la siguiente muestra :

public class CookieAwareWebClient : WebClient { private readonly CookieContainer m_container = new CookieContainer(); protected override WebRequest GetWebRequest(Uri address) { WebRequest request = base.GetWebRequest(address); HttpWebRequest webRequest = request as HttpWebRequest; if (webRequest != null) { webRequest.CookieContainer = m_container; } return request; } }

¿Es esta la mejor manera de hacerlo?


Creo que hay una manera más limpia donde no tienes que crear un nuevo cliente web (y también funcionará con bibliotecas de terceros)

internal static class MyWebRequestCreator { private static IWebRequestCreate myCreator; public static IWebRequestCreate MyHttp { get { if (myCreator == null) { myCreator = new MyHttpRequestCreator(); } return myCreator; } } private class MyHttpRequestCreator : IWebRequestCreate { public WebRequest Create(Uri uri) { var req = System.Net.WebRequest.CreateHttp(uri); req.CookieContainer = new CookieContainer(); return req; } } }

Ahora todo lo que tiene que hacer es elegir los dominios que desea usar:

WebRequest.RegisterPrefix("http://example.com/", MyWebRequestCreator.MyHttp);

Eso significa que CUALQUIER webrequest que vaya a example.com ahora usará su creador webrequest personalizado, incluido el cliente web estándar. Este enfoque significa que no tiene que tocar todo lo que codifica. Simplemente llame al prefijo de registro una vez y termine con él. También puede registrarse para el prefijo "http" para optar por todo en todas partes.


Esta es solo una extensión del artículo que encontraste.

public class WebClientEx : WebClient { public WebClientEx(CookieContainer container) { this.container = container; } public CookieContainer CookieContainer { get { return container; } set { container= value; } } private CookieContainer container = new CookieContainer(); protected override WebRequest GetWebRequest(Uri address) { WebRequest r = base.GetWebRequest(address); var request = r as HttpWebRequest; if (request != null) { request.CookieContainer = container; } return r; } protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result) { WebResponse response = base.GetWebResponse(request, result); ReadCookies(response); return response; } protected override WebResponse GetWebResponse(WebRequest request) { WebResponse response = base.GetWebResponse(request); ReadCookies(response); return response; } private void ReadCookies(WebResponse r) { var response = r as HttpWebResponse; if (response != null) { CookieCollection cookies = response.Cookies; container.Add(cookies); } } }


HttpWebRequest modifica el CookieContainer asignado a él. No es necesario procesar las cookies devueltas. Simplemente asigne su contenedor de cookies a cada solicitud web.

public class CookieAwareWebClient : WebClient { public CookieContainer CookieContainer { get; set; } = new CookieContainer(); protected override WebRequest GetWebRequest(Uri uri) { WebRequest request = base.GetWebRequest(uri); if (request is HttpWebRequest) { (request as HttpWebRequest).CookieContainer = CookieContainer; } return request; } }


Sí. En mi humilde opinión, anulando GetWebRequest () es la mejor solución para funcionalidades limitadas de WebClient. Antes de saber sobre esta opción, escribí muchos códigos realmente dolorosos en la capa HttpWebRequest porque WebClient casi, pero no del todo, hizo lo que necesitaba. La derivación es mucho más fácil.

Otra opción es utilizar la clase de WebClient habitual, pero rellenar manualmente el encabezado Cookie antes de realizar la solicitud y luego extraer el encabezado Set-Cookies en la respuesta. Hay métodos auxiliares en la clase CookieContainer que facilitan la creación y el análisis de estos encabezados: CookieContainer.SetCookies() y CookieContainer.GetCookieHeader() , respectivamente.

Prefiero el enfoque anterior, ya que es más fácil para quien llama y requiere un código menos repetitivo que la segunda opción. Además, el enfoque de derivación funciona de la misma manera para múltiples escenarios de extensibilidad (por ejemplo, cookies, proxies, etc.).


WebClient wb = new WebClient(); wb.Headers.Add(HttpRequestHeader.Cookie, "somecookie");

De los comentarios

¿Cómo se formatea el nombre y el valor de la cookie en lugar de "somecookie"?

wb.Headers.Add(HttpRequestHeader.Cookie, "cookiename=cookievalue");

Para múltiples cookies:

wb.Headers.Add(HttpRequestHeader.Cookie, "cookiename1=cookievalue1;" + "cookiename2=cookievalue2");