在 WebBrowser 中使用来自 CookieContainer 的 cookie

Posted

技术标签:

【中文标题】在 WebBrowser 中使用来自 CookieContainer 的 cookie【英文标题】:Use cookies from CookieContainer in WebBrowser 【发布时间】:2011-05-10 06:26:20 【问题描述】:

有什么方法可以让我实际使用 cookie 容器中的 cookie(之前取自 WebRequest)并在 WebBrowser 控件中使用它们?如果是这样,我该怎么做?这是针对 C# 中的 Winforms 应用程序。

【问题讨论】:

【参考方案1】:

您需要使用InternetSetCookie。这是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); 
     

【讨论】:

我已经有了 cookie 容器和其中的 cookie,我现在需要将这些 cookie 与 webBrowser 控件一起使用,但我不确定如何在其中使用它们。你发给我的只是展示了如何从中取出 cookie,但没有描述如何将它们设置到浏览器。 就是这样。我不需要它来进行网络请求。我需要它作为 WebBrowser。 @Alex 您正在尝试从您已经获得的 CookieContainer 中填充 WebBrowser.Document.Cookie,对吗?【参考方案2】:

这是一个例子哦,这是如何实现的:

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

【讨论】:

【参考方案3】:

尝试首先使用“客户端”CookedWebClient 进行第一次导航并从服务器获取所有 cookie。然后,您可以从 CookedWebClient 或 WebRequest 等其他来源获取 CookedContainer,并在 WebBrowser 中使用它们,如下所示:

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;
        
     

【讨论】:

以上是关于在 WebBrowser 中使用来自 CookieContainer 的 cookie的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF WebBrowser 控件中管理 cookie?

C# webbrowser cookie

在 WebBrowser 控件中设置 cookie

c# WebRequest 使用 WebBrowser cookie

在 webbrowser c# 应用程序中禁用 Cookie 读/写

C#下利用WebBrowser完整获取COOKIE