2009-12-29 23 views
7

¿Hay alguna manera de leer/escribir las cookies que usa un control WebBrowser?¿Administrando cookies en un control WPF WebBrowser?

que estoy haciendo algo como esto ...

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); 

Respuesta

6

el control WebBrowser utiliza WinInet para la red, use específicamente las funciones InternetSetCookie (Ex) y InternetGetCookie (Ex) para la gestión de cookies. No hay un contenedor WinInet en .Net, pero puede invocar p.

+0

+1, no sabía acerca de estas API ... ¡podría ser útil algún día! –

3

Sí, tiene razón, InternetGetCookieEx es la única forma de recuperar cookies HttpOnly y es la forma preferida de capturar cookies desde el control WebBrowser.

He publicado una complete example here

0

que enfrentan el mismo problema hace unos días. Además de los ejemplos de las respuestas anteriores, aquí hay un contenedor Win32 para el control WebBrowser. La ventaja de esta implementación es que expone más opciones que el control WebBrowser predeterminado.

Desafortunadamente, si no es WPF nativo, tendrá que crear un contenedor si planea usarlo en WPF.

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

6

Una de las cosas potencialmente confusas sobre el control WebBrowser y galletas es que, a primera vista, a menudo se ve como su aplicación obtiene una tienda de galletas separada. Por ejemplo, si inicia sesión en un sitio que almacena una cookie persistente para identificarlo, el hecho de que parezca que inició sesión en ese sitio desde una aplicación que aloja el control será independiente de si parece haber iniciado sesión a través de Internet Explorer. .

De hecho, incluso puede iniciar sesión con diferentes identidades.

Sin embargo, aunque podría ser natural llegar a la conclusión de que cada aplicación que aloja el WebBrowser obtiene sus propias cookies, de hecho eso no es cierto. Simplemente hay dos juegos de cookies: los que se usan en el modo de "baja integridad" (que es lo que IE ejecuta de forma predeterminada) y el otro conjunto, que es lo que obtendrá en una aplicación normal que aloja el WebBrowser y también lo que obtendrás si ejecutas IE elevado.

+1

No responde la pregunta de cómo leer y escribir cookies. – Kurren

+1

@ Kurren pero aborda lo que la operación estaba tratando de hacer: ver el código fuente y está claro que el objetivo era cambiar ('escribir') o descubrir ('leer') qué conjunto de cookies en particular era el navegador utilizando. Además, mi respuesta explica que WebBrowser usa las mismas tiendas de cookies que siempre usa IE, lo que te dice que no hay nada especial acerca de cómo acceder a las cookies que utiliza WebBrowser; lo haces de la misma manera que siempre lo harías. Y como Sheng Jiang ya mostró cómo hacerlo, no tendría sentido que lo repitiera; mi objetivo era proporcionar información adicional útil. –

2

Puede usar los métodos Application.GetCookie y Application.SetCookie.

Aunque la aplicación está más o menos relacionada con WPF, puede utilizar estos métodos en cualquier código .NET de escritorio. De hecho, son envoltorios en InternetGetCookieEx y InternetSetCookieEx API de Windows.

+0

Intenté Application.GetCookie y todo lo que obtuve fue NO_MORE_ITEMS. Cuando utilicé el código de muestra de Alkampfer que usaba InternetGetCookieEx directamente, devolvía las cookies correctamente.Creo que debe haber diferentes parámetros enviados por la rutina de la aplicación que evitan que obtenga mis cookies. [Solo sesión], [Solo seguridad], [Solo Http]. –

+0

Sí, el código de alkampfer utiliza el indicador INTERNET_COOKIE_HTTPONLY, mientras que Application.GetCookie no. Esa puede ser la diferencia. Puede ver el código aquí: http://referencesource.microsoft.com/#PresentationCore/src/Core/CSharp/MS/Internal/AppModel/CookieHandler.cs –

Cuestiones relacionadas