Y a-t-il un moyen de lire / écrire les cookies qu'un contrôle WebBrowser utilise?
Je fais quelque chose comme ça ... p>
6 Réponses :
Le contrôle WebBrowser utilise Wininet pour la mise en réseau, utilisez spécifiquement les fonctions internesetcookie (ex) et Internetgetcookie (ex) pour la gestion des cookies. Il n'y a pas de wrapper gagnette dans .NET, mais vous pouvez invoquer P-invoquer. P>
+1, je ne savais pas sur ces API ... pourrait prouver un jour utile!
Oui, vous avez raison, InternetgetcookieEx est le seul moyen de récupérer des cookies httponly et est le moyen préféré de saisir un cookie du contrôle WebBrowser. P>
J'ai posté un exemple complet ici p>
J'ai fait face au même problème il y a quelques jours. Outre les exemples des réponses précédentes, voici une wrapper Win32 pour le contrôle WebBrowser. L'avantage de cette implémentation est qu'il expose plus d'options que le contrôle WebBrowser par défaut. P>
Malheureusement, si ce n'est pas du WPF natif, vous devrez donc créer un wrapper si vous envisagez de l'utiliser dans WPF. P>
L'un des éléments potentiellement déroutants sur le En fait, vous pouvez même être connecté avec différentes identités. P>
Toutefois, bien qu'il puisse être naturel de tirer la conclusion que chaque application hébergeant le WebBrowser code> Le contrôle et les cookies est celui à un premier coup d'œil, il est souvent l'apparence em> comme votre application reçoit un magasin de cookies séparé. Par exemple, si vous vous connectez à un site qui stocke un cookie persistant pour vous identifier, alors que vous souhaitiez être connecté pour ce site à partir d'une application hébergeant le contrôle sera indépendant de savoir si vous semblez être connecté via Internet Explorer . P>
WebBrowser code> obtient donc ses propres cookies, ce n'est pas vrai. Il existe seulement deux ensembles de cookies: celles utilisés en mode 'basse intégrité' (qui est ce que c'est-à-dire que c'est-à-dire par défaut) et l'autre ensemble, qui est ce que vous obtiendrez dans une application normale qui héberge le
WebBrowser code> ainsi que ce que vous obtiendrez si vous exécutez, c'est-à-dire élevé. P>
Ne répond pas à la question de savoir comment lire et écrire des cookies.
@Kurren mais il adresse ce que l'OP essayait de faire - regarder le code source et il est clair que l'objectif était de changer ("écrire") ou de découvrir ("lire") quel ensemble de cookies utilisait le navigateur. . De plus, ma réponse explique que WebBrowser utilise les mêmes magasins de cookies, c'est-à-dire toujours utilisé, ce qui vous indique qu'il n'y a rien de spécial sur la manière d'accéder aux utilisations de cookies WebBrowser - vous le faites de la même manière que vous le feriez toujours. Et puisque Sheng Jiang a déjà montré comment faire cela, il n'y aurait pas de point de le répéter; Mon objectif était de fournir des informations supplémentaires utiles.
Vous pouvez utiliser Application.getcookie Application.setcookie Méthodes. P >
Bien que l'application soit plus ou moins liée au WPF, vous pouvez utiliser ces méthodes dans n'importe quel code de bureau .NET. En fait, ils sont des emballages sur InternetgetcookeeEx et interneetcookieex API Windows. P>
J'ai essayé application.getcookie et tout ce que j'ai eu était no_more_items. Lorsque j'ai utilisé le code d'échantillon d'Alkampfer qui a utilisé InternetgetcookieEx directement, il a renvoyé les cookies correctement. Je pense qu'il doit y avoir des paramètres différents envoyés par la routine d'application qui empêche de recevoir mes cookies. [Session uniquement], [Secure uniquement], [http uniquement].
Oui, le code de Alkampfer utilise le drapeau Internet_cookie_httparly, tandis qu'applicy.getcooke ne le fait pas. C'est peut-être la différence. Vous pouvez voir le code ici: RéférencesSource. Microsoft.com/#presentationCore/src/core/csh arp / ...
Here is sample from [link][1] > public static class WinInetHelper { public static bool SupressCookiePersist() { // 3 = INTERNET_SUPPRESS_COOKIE_PERSIST // 81 = INTERNET_OPTION_SUPPRESS_BEHAVIOR return SetOption(81, 3); } public static bool EndBrowserSession() { // 42 = INTERNET_OPTION_END_BROWSER_SESSION return SetOption(42, null); } static bool SetOption(int settingCode, int? option) { IntPtr optionPtr = IntPtr.Zero; int size = 0; if (option.HasValue) { size = sizeof(int); optionPtr = Marshal.AllocCoTaskMem(size); Marshal.WriteInt32(optionPtr, option.Value); } bool success = InternetSetOption(0, settingCode, optionPtr, size); if (optionPtr != IntPtr.Zero) Marshal.Release(optionPtr); return success; } [System.Runtime.InteropServices.DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool InternetSetOption( int hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength ); }