2010-11-15 10 views
10

¿Hay alguna forma de que pueda utilizar 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#.Usar cookies de CookieContainer en WebBrowser

Respuesta

9

Necesita hacer uso de InternetSetCookie. Aquí es una sample ...

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

ya tengo el contenedor de galletas y las galletas en su interior, lo que necesito ahora es para usar esas cookies con un control webBrowser, pero no estoy seguro de cómo puedo usarlas en él. Lo que me enviaste solo muestra cómo obtener las cookies, pero no describe cómo configurarlas en un navegador. – Alex

+0

@Alex, se agregaron comentarios adicionales ... –

+0

Esa es la cuestión. No lo necesito para una webrequest. Lo necesito para un WebBrowser. – Alex

4

He aquí un ejemplo oh cómo esto podría lograrse:

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); 
    } 
} 
1

Trate de primer uso "cliente" CookedWebClient por primera navitation y obtener todas las cookies de servidor . A continuación, puede tomar la CookedContainer de CookedWebClient, o alguna otra fuente, como WebRequest, y utilizarlos 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; 
     } 
    } 
} 
Cuestiones relacionadas