c# .net winforms webbrowser-control cookiecontainer

c# - Utiliza cookies de CookieContainer en WebBrowser



selenium captcha (3)

Aquí hay un ejemplo de cómo se podría lograr esto:

private class CookieAwareWebClient : WebClient { public CookieAwareWebClient() { CookieContainer = new CookieContainer(); } public CookieContainer CookieContainer { get; private set; } protected override WebRequest GetWebRequest(Uri address) { var request = base.GetWebRequest(address); var httpRequest = request as HttpWebRequest; if (httpRequest != null) { httpRequest.CookieContainer = CookieContainer; } return request; } } private void Form1_Load(object sender, EventArgs e) { using (var client = new CookieAwareWebClient()) { client.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials; client.DownloadData("http://www.google.com"); var cookies = client.CookieContainer.GetCookies(new Uri("http://www.google.com")); var prefCookie = cookies["PREF"]; webBrowser1.Navigate("http://www.google.com", "", null, "Cookie: " + prefCookie.Value + Environment.NewLine); } }

¿Hay alguna manera de que pueda usar las cookies de un contenedor de cookies (tomado de una WebRequest anteriormente) y usarlas en un control WebBrowser? Si es así, ¿cómo haría esto? Esto es para una aplicación Winforms en C #.


Necesita hacer uso de InternetSetCookie . Aquí hay una muestra ...

public partial class WebBrowserControl : Form { private String url; [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData); public WebBrowserControl(String path) { this.url = path; InitializeComponent(); // set cookie InternetSetCookie(url, "JSESSIONID", Globals.ThisDocument.sessionID); // navigate webBrowser.Navigate(url); } }


Trate de usar primero CookedWebClient "cliente" para la primera navegación y obtenga todas las cookies del servidor. Luego puede tomar CookedContainer de CookedWebClient, o alguna otra fuente como WebRequest, y utilizarlas en WebBrowser como se muestra a continuación:

namespace ExampleWebBrowser { public partial class Form1 : Form { [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData); CookedWebClient client = new CookedWebClient(); .. .. .. private void usingWebBrowserWithWebClientCookies(string url) { CookieCollection cookies = client.Cookies.GetCookies(url); for (int i = 0; i < cookies.Count; i++) { Cookie c = cookies[i]; InternetSetCookie(url, c.Name, c.Value); } webBrowser1.Navigate(url); } } public class CookedWebClient : WebClient { CookieContainer cookies = new CookieContainer(); public CookieContainer Cookies { get { return cookies; } } protected override WebRequest GetWebRequest(Uri address) { WebRequest request = base.GetWebRequest(address); if (request.GetType() == typeof(HttpWebRequest)) ((HttpWebRequest)request).CookieContainer = cookies; return request; } } }