1

我正在尝试显示一个需要先登录的网页。我正在使用 HttpWebRequest/Response 对象通过在后台收集会话和授权 cookie 来部分完成日志记录。

登录后,HttpWebResponse 对象返回给我我想通过 WebBrowser 控件向用户显示的 HTML 页面,因此我知道我有正确的会话/授权 cookie 集来访问所需的网页。

使用相关 cookie 正确填充 CookieContainer 后,我将 WebBrowser.DocumentText 属性设置为准备好的 HTML,其中包含对我要显示的网址的 GET 命令。浏览器弹出尝试呈现准备好的 HTML,我假设我收到与丢失 cookie 相关的服务器错误。

当我在调用 DocumentText 属性之前尝试设置 WebBrowser.Document.Cookie 时,在我看到的调试器中,Cookie 属性在尝试将其设置为“cookName=cookValue;cookName=”形式的字符串后始终保持为空烹饪价值;”。

为什么 Cookie 属性拒绝我传递的 cookie 字符串?这与 HttpOnly cookie 有关吗?我的 cookie 字符串格式不正确吗?我是否试图在错误的时间设置 Cookie 属性?

我进行了 WebBrowser.Navigate("about:blank") 调用,这似乎是正确初始化 WebBrowser 对象所必需的。

4

1 回答 1

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) 不包括“过期”值,尽管返回“真”,但 InternetSetCookie 调用不起作用。"expires" 值将 cookie 转换为持久 cookie,而不是仅会话 cookie。

2) 'browser.Navigate("about:blank");' 似乎不需要。无论有没有这个声明,我都能访问我的页面。

3) browser.Document.Cookie 从来没有为我工作过(总是为空),不管我扔了什么。而且我尝试了很多不同的字符串,包括传递给 InternetSetCookie 的第三个参数的字符串。

于 2012-05-05T22:17:30.917 回答