Есть ли способ, по которому я могу фактически использовать файлы cookie из контейнера cookie (ранее взятые из WebRequest) и использовать их в элементе управления WebBrowser? Если да, то как мне это сделать? Это для приложения Winforms в С#.
Использовать файлы cookie из CookieContainer в WebBrowser
Ответ 1
Вам нужно использовать 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);
}
}
Ответ 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 с сервера. Затем вы можете взять CookedContainer из CookedWebClient или другого источника, такого как WebRequest, и использовать их в 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;
}
}
}