c# html cookies webclient

c# - ¿Aceptar cookies en WebClient?



html (3)

Esto puede ser un duplicado cercano de ¿Cómo puedo hacer que WebClient use cookies?

La pregunta que mencioné anteriormente es para VB.NET, pero el mecanismo debería ser el mismo para C #. Sospecho que el comportamiento que está viendo es que el sitio web está enviando una cookie y luego la está solicitando, pero su cliente no está configurado para devolver la cookie al servidor, por lo que lo interpreta como "no está aceptando cookies".

¿Ha utilizado una herramienta de análisis como Fiddler para analizar qué se está comunicando a / desde su cliente?

También es posible que tenga que enviar un encabezado HTTP en particular para indicar que acepta cookies, pero no recuerdo que haya sido necesario en mi experiencia pasada.

Acabo de empezar a experimentar con C # WebClient . Lo que tengo es el siguiente código que obtiene el código html de un sitio web y lo escribe en un archivo .txt. El único problema que tengo es que algunos sitios web requieren que acepte cookies antes de poder usar el sitio web. Lo que esto causa es que, en lugar de escribir el código html del sitio web real en el archivo .txt, escribe el código html emergente de la cookie.

Código:

string downloadedString; System.Net.WebClient client; client = new System.Net.WebClient(); //"http://nl.wikipedia.org/wiki/Lijst_van_spelers_van_het_Nederlands_voetbalelftal" downloadedString = client.DownloadString(textBox1.Text); using (StreamWriter write = new StreamWriter("Data.txt")) { write.Write(downloadedString); }

Entonces, ¿cuál es la solución a esto? ¿Puede alguien dirigirme al camino correcto?


Simplemente almacene la cadena de cookies de los encabezados en su sesión local _cookies cadena

if (System.Web.HttpContext.Current.Session["cookie"] != null) _cookies = System.Web.HttpContext.Current.Session["cookie"].ToString(); using (WebClient wc = new WebClient()) { wc.Headers.Add("Cookie", _cookies); string HtmlResult = wc.UploadString(bridge_url, myParameters); _cookies = wc.ResponseHeaders["Set-Cookie"]; Debug.WriteLine("Headers" + _cookies); System.Web.HttpContext.Current.Session["cookie"] = _cookies; }


Uso

CookieContainer cookieJar = new CookieContainer(); cookieJar.Add(new Cookie("my_cookie", "cookie_value", "/", "mysite")); CookieAwareWebClient client = new CookieAwareWebClient(cookieJar); string response = client.DownloadString("http://example.com/response_with_cookie_only.php");

public class CookieAwareWebClient : WebClient { public CookieContainer CookieContainer { get; set; } public Uri Uri { get; set; } public CookieAwareWebClient() : this(new CookieContainer()) { } public CookieAwareWebClient(CookieContainer cookies) { this.CookieContainer = cookies; } protected override WebRequest GetWebRequest(Uri address) { WebRequest request = base.GetWebRequest(address); if (request is HttpWebRequest) { (request as HttpWebRequest).CookieContainer = this.CookieContainer; } HttpWebRequest httpRequest = (HttpWebRequest)request; httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; return httpRequest; } protected override WebResponse GetWebResponse(WebRequest request) { WebResponse response = base.GetWebResponse(request); String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie]; //do something if needed to parse out the cookie. if (setCookieHeader != null) { Cookie cookie = new Cookie(); //create cookie this.CookieContainer.Add(cookie); } return response; } }

Verá dos métodos reemplazados para GetWebRequest y GetWebResponse. Estos métodos pueden ser anulados para manejar el contenedor de cookies.