WebBrowser.Document.Cookie不接受我的CookieContainer cookie

时间:2012-04-25 13:36:16

标签: c# cookies browser cookiecontainer

我正在尝试显示一个首先需要登录的网页。 我正在使用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对象所必需的。

1 个答案:

答案 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第三个参数的字符串。