Anteriormente he usado 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 el que hay para HttpWebRequests ( request.CookieContainer
). ¿Cómo puedo recolectar cookies de un WebClient en un CookieContainer?
Yo en Google para esto y encontré el siguiente ejemplo :
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?
c#
cookies
httpwebrequest
webclient
cookiecontainer
Maxim Zaslavsky
fuente
fuente
m_container
nunca se establece? ¿No está siempre vacío?Respuestas:
Si. En mi humilde opinión, anular GetWebRequest () es la mejor solución para la funcionalidad limitada de WebClient. Antes de conocer esta opción, escribí un montón de código realmente doloroso 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 usar la clase WebClient normal, pero llenar manualmente el encabezado de Cookie antes de realizar la solicitud y luego extraer el encabezado Set-Cookies en la respuesta. Existen métodos auxiliares en la clase CookieContainer que facilitan la creación y el análisis de estos encabezados:
CookieContainer.SetCookies()
yCookieContainer.GetCookieHeader()
, respectivamente.Prefiero el primer enfoque, ya que es más fácil para la persona que llama y requiere menos código 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.).
fuente
De comentarios
¿Cómo formatea el nombre y el valor de la cookie en lugar de "somecookie"?
Para múltiples cookies:
fuente
Este es solo una extensión del artículo que encontraste.
fuente
readonly
modificador delcontainer
campo, de lo contrario no puede configurarlo en la propiedad. Modifiqué el código.Set-Cookie
encabezado de respuestaReadCookies
?GetWebResponse
yReadCookies
, ya que las cookies se agregarán al contenedor automáticamente.HttpWebRequest modifica el CookieContainer asignado a él. No es necesario procesar las cookies devueltas. Simplemente asigne su contenedor de cookies a cada solicitud web.
fuente
Creo que hay una forma más limpia de no tener que crear un nuevo cliente web (y también funcionará con bibliotecas de terceros)
Ahora todo lo que tiene que hacer es optar por qué dominios desea usar esto:
Eso significa que CUALQUIER webrequest que vaya a example.com ahora usará su creador de webrequest personalizado, incluido el cliente web estándar. Este enfoque significa que no tiene que tocar todo su código. 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.
fuente