我正在尝试显示一个首先需要登录的网页。 我正在使用HttpWebRequest / Response对象来部分完成日志记录,方法是在后台收集会话和授权cookie。
登录后,HttpWebResponse对象返回我想要通过WebBrowser控件向用户显示的HTML页面,因此我知道我有正确的会话/授权cookie集到达所需的网页。< / p>
让CookieContainer正确填充相关的cookie,我将WebBrowser.DocumentText属性设置为准备好的HTML,其中包含对我正在尝试显示的Web地址的GET命令。浏览器弹出试图渲染准备好的HTML,我得到一个与丢失的cookie有关的服务器错误,我认为。
当我在调用DocumentText属性之前尝试设置WebBrowser.Document.Cookie时,在我看到的调试器中,在尝试将其设置为“cookName = cookValue”形式的字符串后,Cookie属性始终保持为null ; cookName = cookValue;“。
为什么Cookie属性会拒绝我传递的cookie字符串?这与HttpOnly cookies有关吗?我的cookie字符串格式不正确吗?我是否尝试在错误的时间设置Cookie属性?
我进行了WebBrowser.Navigate(“about:blank”)调用,这似乎是正确初始化WebBrowser对象所必需的。
答案 0 :(得分:2)
这对我有用:
using System.Runtime.InteropServices;
[DllImport("wininet.dll",CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData);
//'CookieCollection' was populated using HttpWebRequest/Response calls
int i=0;
InternetSetCookie("https://www.myurl.com/", null, CookieCollection[i++].ToString() + "; expires = Sun, 01-Jan-2013 00:00:00 GMT");
//repeat for however many cookies you've got
browser.Navigate("https://www.myurl.com/tools/..../Index.aspx?t=someValue", true);
//or
browser.DocumentText = someHtml;
注意:
1)尽管返回'true',但不包括“expires”值,InternetSetCookie调用不起作用。 “expires”值将cookie转换为持久cookie,而不是仅会话cookie。
2)'browser.Navigate(“about:blank”);'似乎没有必要。无论有没有这个陈述,我都可以进入我的页面。
3)browser.Document.Cookie从来没有为我工作过(总是空的),不管我扔了什么。我尝试了很多不同的字符串,包括传入InternetSetCookie第三个参数的字符串。