2010-11-15 3 views
10

Y a-t-il un moyen pour que je puisse réellement utiliser les cookies d'un conteneur de cookies (provenant d'une demande de WebRequest) et les utiliser dans un contrôle WebBrowser? Si oui, comment ferais-je cela? C'est pour une application Winforms en C#.Utiliser les cookies de CookieContainer dans WebBrowser

Répondre

9

Vous devez utiliser InternetSetCookie. Voici un 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

J'ai déjà le conteneur à biscuits et les biscuits à l'intérieur, ce que je dois maintenant pour utiliser ces cookies avec un contrôle webBrowser, mais je ne suis pas sûr de savoir comment je peux les utiliser à l'intérieur. Ce que vous m'avez envoyé montre juste comment en sortir les cookies, mais ne décrit pas comment les mettre dans un navigateur. – Alex

+0

@Alex, ajouté des commentaires supplémentaires ... –

+0

Thats la chose. Je n'en ai pas besoin pour un webrequest. J'en ai besoin pour un WebBrowser. – Alex

4

Voici un exemple oh comment cela pourrait être réalisé:

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

Essayez de la première utilisation « client » CookedWebClient pour la première navitation et obtenir tous les cookies de serveur . Ensuite, vous pouvez prendre la CookedContainer de CookedWebClient ou d'une autre source comme WebRequest, et les utiliser dans WebBrowser comme indiqué ci-dessous:

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; 
     } 
    } 
} 
Questions connexes