Y a-t-il un moyen pour que je puisse réellement utiliser les cookies d'un conteneur de cookies (provenant d'une demande de WebRequest) et les utiliser dans un contrôle WebBrowser? Si oui, comment ferais-je cela? C'est pour une application Winforms en C#.Utiliser les cookies de CookieContainer dans WebBrowser
10
A
Répondre
9
Vous devez utiliser InternetSetCookie. Voici un 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);
}
}
4
Voici un exemple oh comment cela pourrait être réalisé:
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);
}
}
1
Essayez de la première utilisation « client » CookedWebClient pour la première navitation et obtenir tous les cookies de serveur . Ensuite, vous pouvez prendre la CookedContainer de CookedWebClient ou d'une autre source comme WebRequest, et les utiliser dans WebBrowser comme indiqué ci-dessous:
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;
}
}
}
J'ai déjà le conteneur à biscuits et les biscuits à l'intérieur, ce que je dois maintenant pour utiliser ces cookies avec un contrôle webBrowser, mais je ne suis pas sûr de savoir comment je peux les utiliser à l'intérieur. Ce que vous m'avez envoyé montre juste comment en sortir les cookies, mais ne décrit pas comment les mettre dans un navigateur. – Alex
@Alex, ajouté des commentaires supplémentaires ... –
Thats la chose. Je n'en ai pas besoin pour un webrequest. J'en ai besoin pour un WebBrowser. – Alex