РЕДАКТИРОВАТЬ: Насколько я знаю, нет решения этой проблемы, что делает его еще одним свидетельством того, что не следует использовать WebBrowser C #. Мы запустили предупреждающий знак в начале нашей программы, уведомляющий пользователя о том, что куки будут очищены для IE.
Краткая версия того, что я пытаюсь сделать, находится в названии. Вот длинная версия.
У меня есть небольшая сложная проблема, и я уверен, что в ответ я получу множество догадок. Чтобы свести к минимуму хорошо продуманные, но, к сожалению, бесполезные догадки, позвольте мне сначала упомянуть, что решение этой проблемы не простое, поэтому простые предложения, к сожалению, не помогут вообще, даже если я ценю эти усилия.
Компонент .NET WebBrowser по сути своей является IE, поэтому решения с любыми оговорками почти наверняка не будут работать. Мне нужно делать именно то, что я пытаюсь сделать, и даже незначительное предостережение полностью победит цель. Рискуя казаться высокомерным, мне нужна помощь кого-то, кто действительно обладает глубокими знаниями о .NET WebBrowser и / или WinInet и / или о том, как общаться с базовой системой Windows из C # ... или как инкапсулировать код C ++ в C #.
Тем не менее, я не ожидаю, что кто-то сделает это для меня, и я нашел несколько многообещающих подсказок, которые будут объяснены позже в этом вопросе.
Но сначала ... то, чего я пытаюсь достичь, это.
У меня есть компонент Windows.Forms, который содержит элемент управления WebBrowser. Этот элемент управления должен:
- Очистить ВСЕ куки для ВСЕХ сайтов.
- Посетите несколько веб-сайтов, один за другим, записывайте файлы cookie и обрабатывайте их правильно. Эта часть уже работает нормально, поэтому у меня нет проблем с этим.
- Прополощите и повторите ... теоретически навсегда.
Теперь вот настоящая проблема. Мне нужно очистить все эти файлы 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
Мне кажется, я примерно знаю что делают эти вещи, я просто не знаю как их использовать.