Gerenciando cookies em um controle WPF WebBrowser?
-
21-09-2019 - |
Pergunta
Existe uma maneira de ler/gravar os cookies que um controle WebBrowser usa?
Estou fazendo algo assim...
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);
Solução
O WebBrowser Control usa o Wininet para redes, use especificamente as funções InternetSetCookie (Ex) e InternetGetCookie (EX) para gerenciamento de cookies. Não há um invólucro Wininet no .NET, mas você pode fazer um p-invoke.
Outras dicas
Uma das coisas potencialmente confusas sobre o WebBrowser
controle e cookies é que, à primeira vista, muitas vezes visual como se seu aplicativo tivesse um armazenamento de cookies separado.Por exemplo, se você fizer login em um site que armazena um cookie persistente para identificá-lo, se você parecer estar conectado nesse site a partir de um aplicativo que hospeda o controle será independente de você parecer estar conectado via Internet Explorer .
Na verdade, você pode até estar logado com identidades diferentes.
No entanto, embora possa ser natural tirar a conclusão de que cada aplicativo que hospeda o WebBrowser
portanto, obtém seus próprios cookies; na verdade, isso não é verdade.Existem apenas dois conjuntos de cookies:aqueles usados no modo de 'baixa integridade' (que é o que o IE executa por padrão) e o outro conjunto, que é o que você obterá em um aplicativo normal que hospeda o WebBrowser
e também o que você obterá se executar o IE elevado.
Sim, você está certo, o InternetGetCookieEx é a única maneira de recuperar os cookies httponly e é a maneira preferida de pegar o Cookie do Webbrowser Control.
Eu postei um Exemplo completo aqui
Você pode usar Application.getCookie e Application.setCookie métodos.
Embora o aplicativo esteja mais ou menos relacionado ao WPF, você pode usar esses métodos em qualquer código .NET da área de trabalho. Na verdade, eles são embalagens InternetGetCookieEx e InternetsetCookieEx Windows APIs.
Eu enfrentei o mesmo problema há alguns dias. Além dos exemplos das respostas anteriores, aqui está um invólucro do Win32 para o controle WebBrowser. A vantagem desta implementação é que ela expõe mais opções que o controle padrão do WebBrowser.
Infelizmente, se não for o nativo do WPF, você precisará criar um invólucro se planeja usá -lo no WPF.