Очистка файлов cookie элемента управления WebBrowser БЕЗ очистки для самого IE - PullRequest
16 голосов
/ 11 марта 2010

РЕДАКТИРОВАТЬ: Насколько я знаю, нет решения этой проблемы, что делает его еще одним свидетельством того, что не следует использовать WebBrowser C #. Мы запустили предупреждающий знак в начале нашей программы, уведомляющий пользователя о том, что куки будут очищены для IE.

Краткая версия того, что я пытаюсь сделать, находится в названии. Вот длинная версия.

У меня есть небольшая сложная проблема, и я уверен, что в ответ я получу множество догадок. Чтобы свести к минимуму хорошо продуманные, но, к сожалению, бесполезные догадки, позвольте мне сначала упомянуть, что решение этой проблемы не простое, поэтому простые предложения, к сожалению, не помогут вообще, даже если я ценю эти усилия.

Компонент .NET WebBrowser по сути своей является IE, поэтому решения с любыми оговорками почти наверняка не будут работать. Мне нужно делать именно то, что я пытаюсь сделать, и даже незначительное предостережение полностью победит цель. Рискуя казаться высокомерным, мне нужна помощь кого-то, кто действительно обладает глубокими знаниями о .NET WebBrowser и / или WinInet и / или о том, как общаться с базовой системой Windows из C # ... или как инкапсулировать код C ++ в C #.

Тем не менее, я не ожидаю, что кто-то сделает это для меня, и я нашел несколько многообещающих подсказок, которые будут объяснены позже в этом вопросе.

Но сначала ... то, чего я пытаюсь достичь, это.

У меня есть компонент Windows.Forms, который содержит элемент управления WebBrowser. Этот элемент управления должен:

  1. Очистить ВСЕ куки для ВСЕХ сайтов.
  2. Посетите несколько веб-сайтов, один за другим, записывайте файлы cookie и обрабатывайте их правильно. Эта часть уже работает нормально, поэтому у меня нет проблем с этим.
  3. Прополощите и повторите ... теоретически навсегда.

Теперь вот настоящая проблема. Мне нужно очистить все эти файлы cookie (для любого и всех сайтов), но только для самого элемента управления WebBrowser, а НЕ для файлов cookie, которые должным образом использует IE. Что в корне неверно в этом подходе, так это тот факт, что элемент управления .NET WebBrowser является IE. Но я упрямый молодой человек, и я настаиваю на том, чтобы это было возможно, иначе! ;)

Вот где я застрял на данный момент.

Совершенно просто невозможно очистить все файлы cookie для элемента управления WebBrowser программным способом только на C #. Нужно использовать DllImport и все сумасшедшие вещи, которые идут с ним. Этот кусок отлично работает для этой цели:

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

И затем, в функции, которая фактически очищает куки:

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

Тогда все куки очищаются, и поэтому я счастлив. Программа работает точно так, как задумано, за исключением того факта, что она также очищает куки IE, что не должно допускаться.

От одного товарища из StackOverflower (если это слово) Шен Цзян предложил это в другой проблеме в комментарии, но не уточнил:

«Если вы хотите изолировать куки-файлы вашего приложения, вам нужно переопределить параметр реестра Cache directory с помощью IDocHostUIHandler2 :: GetOverrideKeyPath»

Я искал в интернете IDocHostUIHandler2 и GetOverrideKeyPath, но я не представляю, как использовать их из C # для изоляции файлов cookie для моего элемента управления WebBrowser. Мой опыт работы с реестром Windows ограничен RegEdit (поэтому я понимаю, что это древовидная структура с различными типами данных, но это все ... У меня нет глубоких знаний о взаимоотношениях реестра с IE, например).

Вот что я откопал на MSDN:

IDocHostUIHandler2 документы: http://msdn.microsoft.com/en-us/library/aa753275%28VS.85%29.aspx

Документы GetOverrideKeyPath: http://msdn.microsoft.com/en-us/library/aa753274%28VS.85%29.aspx

Мне кажется, я примерно знаю что делают эти вещи, я просто не знаю как их использовать.

Ответы [ 3 ]

4 голосов
/ 11 марта 2010

Нужно ли, чтобы в IE работали файлы cookie одновременно? Можно ли "восстановить" исходные файлы cookie в IE после запуска вашей программы?

UPDATE:

Другая идея:

Интересно, что произойдет, если вы запустите свою программу под другой учетной записью пользователя через Олицетворение. Возможно, что эти куки будут храниться под другим профилем Windows ...

2 голосов
/ 12 марта 2010

Этот комментарий на Как установить и удалить куки из WebBrowser Control для произвольных доменов - ошибка. Параметр папки кэша WinInet, по-видимому, отсутствует в настройках IE, но является параметром папки Shell, поскольку IDocHostUIHandler2 может настраивать только параметры, хранящиеся в разделе реестра IE, что не полезно для этой задачи. Я не знаю способа настроить местоположение папки, кроме как перехватить все API WinInet (и застрял с обновлением приложения, чтобы приспособить будущие API WinInet), что не легко в C #. Я обновлю старый пост сейчас.

0 голосов
/ 01 июня 2010

http://wiki.imacros.net/iimInit%28%29#Separate_Browser_Instances объясняет решение.В основном iMacros использует режим IE InPrivate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...