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

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

【问题讨论】:

    标签: c# .net winforms webbrowser-control cookiecontainer


    【解决方案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;
              }
           }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-14
        • 1970-01-01
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        • 2015-08-17
        相关资源
        最近更新 更多