在通过 WPF WebBrowser 控件成功登录到安全 Web 门户后,我尝试将 WebRequest 构建到网页,但遇到了在 WebRequest 中重用 WebBrowser cookie 的问题。
与 WinForms 不同,在 WPF WebBrowser 控件中,无法通过 WebBrowser.Document.Cookies 提取 CookieCollection,因为 Document 对象没有 Cookies 属性。这
我发现的唯一方法是使用 mshtml.HTMLDocument2 将 cookie 作为字符串
mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)webBrowser.Document;
string cookies = doc.cookie;
然而,它不够好,看起来像 MSHTML.Document2
- 不允许提取重要的 HttpOnly cookie(如 ASP.Net_SessionID)
- 我需要从 Cookies 字符串手动构造 CookiesCollection 对象。
因此,由于 ASP.Net_SessionID 不可用,具有从字符串构造的 cookie 的 WebRequest 因 session 超时错误而失败。
是否有另一种方法可以从 WPF WebBrowser 控件构建正确且完整的 CookieCollection 对象?
最佳答案
更新:在 EricLaw 发表他的评论后,这里有一段代码,你可以用来获取 HttpOnly cookie:
[DllImport("wininet.dll", SetLastError = true)]
private static extern bool InternetGetCookieEx(string pchURL, string pchCookieName,
StringBuilder pchCookieData, ref System.UInt32 pcchCookieData,
int dwFlags, IntPtr lpReserved);
private int INTERNET_COOKIE_HTTPONLY = 0x00002000;
public void GetCookie()
{
string url = "http://www.bing.com";
string cookieName = "ASP.NET_SessionId";
StringBuilder cookie = new StringBuilder();
int size = 256;
InternetGetCookieEx(url, cookieName, cookie, ref size,
INTERNET_COOKIE_HTTPONLY, null)
}
该值将存储在 StringBuilder“cookie”中
可以在此 MSDN blog post 中找到更详细的示例.
我所知道的从 WebBrowser 获取 cookie 的唯一其他可能方法是使用 InternetGetCookie 方法,如本文 StackOverflow answer 中所述。 .
但是,不可能获得 HttpOnly cookie,因为它们作为浏览器中的安全功能无法检索。这有助于防止跨站点脚本。这在 WinForms 中的工作方式与在 WPF 中的工作方式相同。更多关于 HttpOnly cookie 的信息可以在 Wikipedia HTTP Cookie article 中找到。 .
关于要在 WebRequest 中使用的 WPF WebBrowser Cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1284232/