有什么办法可以实际使用cookie容器中的cookie(以前从WebRequest取)并将其用于WebBrowser控件?如果是这样,我该怎么做?这是用于C#中的Winforms应用程序。

有帮助吗?

解决方案

您需要使用 InternetetCookie. 。这里有一个 样本...

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

其他提示

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

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

尝试首先将“客户端” CookedWebclient用于第一个航,并从服务器中获取所有cookie。然后,您可以从cookedwebclient或WebRequest(例如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;
        }
     }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top