2010-03-11 3 views
15

EDIT: Autant que je sache, il n'y a pas de solution à ce problème, ce qui prouve encore une fois qu'il ne faut pas utiliser WebBrowser C#. Nous avons fini avec un panneau d'avertissement au début de notre programme, notifiant à l'utilisateur que les cookies seront effacés pour IE.Effacement des cookies du contrôle WebBrowser pour tous les sites SANS correction pour IE lui-même

La version courte de ce que j'essaie de faire est dans le titre. Voici la version longue.

J'ai un problème complexe auquel je suis sûr que je vais recevoir beaucoup de suppositions en réponse à. Pour garder au minimum les suppositions bien intentionnées mais malheureusement inutiles, permettez-moi d'abord de mentionner que la solution à ce problème n'est pas simple, donc des suggestions simples ne vont malheureusement pas aider du tout, même si j'apprécie l'effort.

Le composant .NET WebBrowser est fondamentalement IE lui-même, donc les solutions avec toutes sortes de mises en garde ne fonctionneront certainement pas. Je dois faire exactement ce que j'essaie de faire, et même une mise en garde apparemment mineure va complètement à l'encontre du but. Au risque de sembler arrogant, j'ai besoin de l'aide de quelqu'un qui a vraiment des connaissances approfondies sur le .NET WebBrowser et/ou WinInet et/ou comment communiquer avec le système sous-jacent de Windows à partir de C# ... ou comment encapsuler du code C++ dans C#. Cela dit, je ne m'attends pas à ce que quelqu'un le fasse pour moi, et j'ai trouvé quelques conseils prometteurs qui sont expliqués plus tard dans cette question.

Mais d'abord ... ce que j'essaye de réaliser est ceci.

J'ai un composant Windows.Forms qui contient un contrôle WebBrowser. Ce contrôle doit:

  1. Effacer TOUS les cookies pour TOUS les sites Web.
  2. Visitez plusieurs sites Web, les uns après les autres, enregistrez des cookies et gérez-les correctement. Cette partie fonctionne déjà très bien, donc je n'ai aucun problème avec ça. Rincer et répéter ... théoriquement pour toujours.

Maintenant, voici le vrai problème. J'ai besoin d'effacer tous ces cookies (pour tous les sites), mais seulement pour le contrôle WebBrowser lui-même et PAS les cookies que IE utilise correctement. Ce qui est fondamentalement faux avec cette approche est bien sûr le fait que le contrôle .NET WebBrowser est IE. Mais je suis un jeune homme têtu et j'insiste pour que ce soit possible, sinon! ;)

Voici où je suis coincé pour le moment.

Il est tout simplement impossible d'effacer tous les cookies pour le contrôle WebBrowser par programmation via C# seul. Il faut utiliser DllImport et toutes les choses folles qui vont avec. Ce morceau fonctionne très bien à cette fin:

[DllImport("wininet.dll", SetLastError = true)] 
private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);

Et puis, dans la fonction qui ne fait la compensation des cookies:

InternetSetOption(IntPtr.Zero, INTERNET_OPTION_END_BROWSER_SESSION, IntPtr.Zero, 0); 

Ensuite, tous les cookies effacés et s'en tant que tel, je suis content. Le programme fonctionne exactement comme prévu, outre le fait qu'il efface également les cookies d'IE, ce qui ne doit pas être autorisé.

D'un camarade StackOverflower (si c'est un mot), Sheng Jiang a proposé à un autre problème dans un commentaire, mais n'a pas précisé plus:

« Si vous voulez isoler les cookies de votre application, vous devez remplacer le paramètre de registre de répertoire du cache via IDocHostUIHandler2 :: GetOverrideKeyPath »

Je l'ai regardé autour de l'Internet pour IDocHostUIHandler2 et GetOverrideKeyPath, mais j'ai aucune idée de la façon de les utiliser à partir de C# pour isoler les cookies à mon contrôle WebBrowser. Mon expérience avec le registre Windows est limitée à RegEdit (donc je comprends que c'est une arborescence avec différents types de données mais c'est à peu près ça ... Je n'ai pas de connaissance approfondie de la relation du registre avec IE, par exemple).

Voici ce que je dégoté sur MSDN:

IDocHostUIHandler2 docs: http://msdn.microsoft.com/en-us/library/aa753275%28VS.85%29.aspx

GetOverrideKeyPath docs: http://msdn.microsoft.com/en-us/library/aa753274%28VS.85%29.aspx

Je pense que je sais à peu près ce ces choses font, je ne juste » Je sais comment pour les utiliser.

+0

Le contrôle de navigateur Web .NET (il n'y a évidemment pas de contrôle de navigateur Web C#) est un wrapper. iexplore.exe est un wrapper. Ils sont tous les deux des enveloppes autour de la même chose. Je ne pense pas que vous serez en mesure de le faire, car ils donnent tous deux accès au même composant. –

+0

Notez également que les liens de documentation que vous avez publiés font référence au "contrôle WebBrowser". Cela fait référence au contrôle Win32 et non à la version .NET. –

+0

Oui, c'est exactement pourquoi je suis perdu. Si c'était la version .NET, je n'aurais aucun problème. :) – Teekin

Répondre

4

Est-il nécessaire d'avoir les cookies fonctionnels dans IE en même temps? Est-il possible de "restaurer" les cookies d'origine à IE après l'exécution de votre programme?

MISE À JOUR:

Une autre idée:

Je me demande ce qui se passerait si vous avez exécuté votre programme sous un compte utilisateur différent, par usurpation d'identité. Il est possible qu'il stocke ces cookies sous un autre profil Windows ...

+0

Hmmm ... pas des idées folles du tout!Ce que je n'aime pas à propos de l'idée précédente, c'est que ce programme est destiné aux utilisateurs ... et nous savons tous à quoi ils ressemblent. L'idée d'usurpation d'identité est également intéressante, même si je parie que je rencontrerais des problèmes avec les clients sous Windows XP et avant ... mais je vais les vérifier, merci! – Teekin

+0

Si quelqu'un avec 10 rang posté cela, comme une * réponse *, ils seraient sûrement ridiculisés. –

2

Ce commentaire à How to set and delete cookies from WebBrowser Control for arbitrary domains est une erreur. Le paramètre de dossier de cache WinInet n'est apparemment pas dans les paramètres d'IE mais est un paramètre de dossier Shell, puisque IDocHostUIHandler2 peut uniquement personnaliser les paramètres stockés dans la clé de registre d'IE, ce n'est pas utile pour cette tâche. Je ne connais pas un moyen de personnaliser l'emplacement du dossier, sauf pour raccorder toutes les API WinInet (et rester avec l'application de mise à jour pour accueillir les futures API WinInet), ce qui n'est pas facile en C#. Je vais mettre à jour le vieux poste maintenant.

+0

Merci d'avoir répondu, Sheng. – Teekin

Questions connexes