在 WebBrowser 中使用来自 CookieContainer 的 cookie

发布于 2024-10-02 17:05:34 字数 119 浏览 18 评论 0原文

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

Is there any way that I can actually use the cookies from a cookie container (taken from a WebRequest previously) and use them in a WebBrowser control? If so, how would I do this? This is for a Winforms application in C#.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

極樂鬼 2024-10-09 17:05:34

您需要使用 InternetSetCookie。这是示例...

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

You need to make use of InternetSetCookie. Here is a 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); 
     }
}
镜花水月 2024-10-09 17:05:34

这是一个如何实现这一点的示例:

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

Here's an example oh how this could be achieved:

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);
    }
}
本王不退位尔等都是臣 2024-10-09 17:05:34

尝试首先使用“客户端”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;
        }
     }
}

Try to first use "client" CookedWebClient for the first navitation and get all the cookies from server. Then you can take the CookedContainer from CookedWebClient, or some other source like WebRequest, and use them in WebBrowser as shown below:

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;
        }
     }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文