2009-12-29 1 views
7

Есть ли способ читать/писать файлы cookie, которые использует элемент управления WebBrowser?Управление кукисами в элементе управления WPF WebBrowser?

Я делаю что-то вроде этого ...

string resultHtml; 
HttpWebRequest request = CreateMyHttpWebRequest(); // fills http headers and stuff 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
{ 
    resultHtml = sr.ReadToEnd(); 
} 
WebBrowser browser = new WebBrowser(); 
browser.CookieContainer = request.CookieContainer; // i wish i could do this :(
browser.NavigateToString(resultHtml); 

ответ

6

управления WebBrowser использует WinInet для сетей, в частности, использовать функции InternetSetCookie (Ex) и InternetGetCookie (Ex) для управления Cookie. В .Net нет оболочки WinInet, но вы можете p-invoke.

+0

+1, я не знал об этих API ... мог оказаться полезным когда-нибудь! –

3

Да, вы правы, InternetGetCookieEx - единственный способ получить HttpOnly-файлы cookie, и это предпочтительный способ захватить файл cookie с помощью элемента управления WebBrowser.

Я разместил complete example here

0

Я сталкивался с такой же вопрос несколько дней назад. Помимо примеров предыдущих ответов, здесь представлена ​​оболочка Win32 для элемента управления WebBrowser. Преимущество этой реализации состоит в том, что она предоставляет больше опций, которыми управляет элемент управления WebBrowser по умолчанию.

К сожалению, если это не родной WPF, вам придется создать оболочку, если вы планируете использовать ее в WPF.

http://code.google.com/p/csexwb2/

6

Одним из потенциально запутанных вещей о WebBrowser контроля и печенье является то, что на первый взгляд, это часто выглядит как ваше приложение получает отдельный печенье магазин. Например, если вы заходите на сайт, на котором хранится постоянный куки-файл, чтобы идентифицировать вас, то независимо от того, будет ли вы регистрироваться на этом сайте внутри приложения, на котором размещен элемент управления, будет независимо от того, как вы вошли в систему через Internet Explorer ,

На самом деле, вы даже можете войти в систему с разными идентификаторами.

Однако, хотя было бы естественно сделать вывод, что каждое приложение, принимающее WebBrowser, получает свои собственные куки-файлы, на самом деле это неверно. Существует только два набора файлов cookie: те, которые используются в режиме «низкой целостности» (по умолчанию это IE), а другой набор, который вы получите в обычном приложении, которое содержит WebBrowser, а также что вы получите, если вы запустите IE.

+1

Не отвечает на вопрос о том, как читать и писать файлы cookie. – Kurren

+1

@Kurren, но он обращается к тому, что пытался сделать op - посмотрите на исходный код, и ясно, что цель заключалась в том, чтобы изменить («написать») или открыть («прочитать»), какой конкретный набор файлов cookie был браузером с помощью. Более того, мой ответ объясняет, что WebBrowser использует те же файлы cookie, которые использует IE, который говорит вам, что нет ничего особенного в том, как обращаться к кукисам, которые использует WebBrowser, - вы делаете это так же, как всегда. И поскольку Шэн Цзян уже показал, как это сделать, мне нечего было повторять; моя цель состояла в том, чтобы предоставить полезную дополнительную информацию. –

2

Вы можете использовать методы Application.GetCookie и Application.SetCookie.

Хотя приложение более или менее связано с WPF, вы можете использовать эти методы в любом настольном коде .NET. Фактически, они являются обертками на InternetGetCookieEx и InternetSetCookieEx Windows API.

+0

Я попробовал Application.GetCookie, и все, что у меня было, было NO_MORE_ITEMS. Когда я использовал образец кода из Alkampfer, который использовал InternetGetCookieEx напрямую, он корректно вернул файлы cookie.Я думаю, что должны быть разные параметры, отправленные приложением, которые не позволяют получать мои файлы cookie. [Только сеанс], [Только для защиты], [Только Http]. –

+0

Да, код alkampfer использует флаг INTERNET_COOKIE_HTTPONLY, а Application.GetCookie - нет. Это может быть разница. Вы можете увидеть код здесь: http://referencesource.microsoft.com/#PresentationCore/src/Core/CSharp/MS/Internal/AppModel/CookieHandler.cs –