c# winform webBrowser 用户登录成功后,获取webBrowser.Document.Cookie 然后通过cookie去post请求

疯子de幸福 2017-01-14 10:50:37
RT.
c# winform webBrowser 首先是跳转到登录页面
webBrowser1.Navigate("http://xxx/PageView/login.aspx");

用户登录成功后,获取webBrowser.Document.Cookie 然后通过cookie去post请求

string cookStr =webBrowser1.Document.Cookie;
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://xxx/getdata.ashx?act=getlist");
request.Accept = "*/*";
request.Method = "get";
request.ContentType = "application/x-www-form-urlencoded";
request.Host = "www.a.com"; //此处已转化
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)";
request.Headers.Add("X-Requested-With", "XMLHttpRequest");
request.Headers.Add("Cookie", cookStr);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();

返回的retString 一直是未登录的请求。。。
将cookStr 转化为CookieCollection 或 Cookiecontainer 去请求,也抓包对比过了,仍然不行。。。
-------------------------------------
修正:webBrowser.Document.Cookie或许并未获取session相关的数据,导致登录失败,
跪求大神帮忙解决~~~
...全文
2803 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
遥远的峰 2019-01-31
  • 打赏
  • 举报
回复
webbrowser拿到的document.cookie是request cookie,你的session如果是服务器传回,应该是response header里的 set-cookie的值。
你可以 net.webclient 直接获取response的head里的set-cookie
yejanjian 2018-06-09
  • 打赏
  • 举报
回复
/// <summary> /// 分解cookies /// </summary> /// <returns></returns> public CookieContainer GetCookieContainer(string Cookie) { CookieContainer container = new CookieContainer(); if (string.IsNullOrEmpty(Cookie)) return null; foreach (string cookie in Cookie.Split(';')) { string name = cookie.Split('=')[0]; string value = cookie.Substring(name.Length + 1); string path = "/"; string domain = "www.baidu.com"; //当前域名或ip container.Add(new Cookie(name.Trim(), value.Trim(), path, domain)); } return container; }
疯子de幸福 2017-01-16
  • 打赏
  • 举报
回复
引用 5 楼 closurer 的回复:
比如你在写在 DocumentCompleted 事件的处理函数里面,就可以获取 webBrowser1.Document.Cookie 的值。
这个我理解,即使在DocumentCompleted 事件里面完成 操作,获取到的依然为null, 服务器端是用session方式验证登录的

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (webBrowser1.ReadyState < WebBrowserReadyState.Complete) return;
            cookStr = webBrowser1.Document.Cookie;
        }
这个即使在登录成功之后 获取到的 依然为null.
闭包客 2017-01-16
  • 打赏
  • 举报
回复
比如你在写在 DocumentCompleted 事件的处理函数里面,就可以获取 webBrowser1.Document.Cookie 的值。
闭包客 2017-01-16
  • 打赏
  • 举报
回复
webBrowser1.Document.Cookie 的值,是在 webBrowser1 收到 Response 之后才有的。
疯子de幸福 2017-01-16
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
贴出你“也抓包对比过了”的实际结果。
我先发下完整代码,你看下代码就知道了,主要是 session没有获取到,在网上查了,写的获取session的方法也试了,获取到为null

//窗体加载事件,指向webBrowser跳转指定地址
 private void Login_Load(object sender, EventArgs e)
 {           
     webBrowser1.Navigate("http://139.129.57.94:8008/PageView/login.aspx");
 }

 //获取数据列表
private void button2_Click(object sender, EventArgs e)
{

        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://139.129.57.94:8008/Handler/KeyWordMgtHandler.ashx?act=getlist");
        request.Method = "get";
        request.ContentType = "application/x-www-form-urlencoded";

        request.Accept = "*/*";
        request.Host = "139.129.57.94:8008";
        request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36";
        request.Headers.Add("X-Requested-With", "XMLHttpRequest");
        request.Headers.Add("Cookie", webBrowser1.Document.Cookie);  //Cookie:ASP.NET_SessionId=gwervpnxevvu3kcgwydhr5mn 这里没有取到,现在服务器端 模拟是session方式判断账号密码,账号 administrator 密码20170116  密码按照当天日期变化
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream myResponseStream = response.GetResponseStream();
        StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
        string retString = myStreamReader.ReadToEnd();  //这里返回的字符串 一直都是未登录
        myStreamReader.Close();
        myResponseStream.Close();
}
疯子de幸福 2017-01-16
  • 打赏
  • 举报
回复
引用 11 楼 crystal_lz 的回复:
访问验证码的连接
这种post登录用cookiecollection 或者 cookiecontainer 就可以,这个只是个demo测试的例子而已,如果要做淘宝客户端登录,然后用 httpwebrequest 获取数据呢
crystal_lz 2017-01-16
  • 打赏
  • 举报
回复

访问验证码的连接
crystal_lz 2017-01-16
  • 打赏
  • 举报
回复

所以说 很名明显了 你直接通过Cookie 是获取不到的
自己 httpwebrequest吧
crystal_lz 2017-01-16
  • 打赏
  • 举报
回复
你贴出来的连接的发送包很简单 直接就是明文的 为什么还要用 webbrowser来登录 直接全部用httpwebrequest不是更简单?。。

然后全程使用一个 CookieContainer 就行了
疯子de幸福 2017-01-16
  • 打赏
  • 举报
回复
引用 7 楼 closurer 的回复:
[quote=引用 6 楼 shenghongjun 的回复:] [quote=引用 5 楼 closurer 的回复:] 比如你在写在 DocumentCompleted 事件的处理函数里面,就可以获取 webBrowser1.Document.Cookie 的值。
这个我理解,即使在DocumentCompleted 事件里面完成 操作,获取到的依然为null, 服务器端是用session方式验证登录的

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (webBrowser1.ReadyState < WebBrowserReadyState.Complete) return;
            cookStr = webBrowser1.Document.Cookie;
        }
这个即使在登录成功之后 获取到的 依然为null.[/quote] 呃……这个可能性有很多。 有时候一个页面加载了,DocumentCompleted 会触发多次,可能因为有些异步加载的内容。 另外,session 是服务器端的概念,客户端是不需要理会的,客户端只需要关心 cookies 就行了。 [/quote] 这个多次触发的在这里已经return了,这里执行的是最后一次加载完毕后的。 if (webBrowser1.ReadyState < WebBrowserReadyState.Complete) return; 所以,这里不是cookie问题,而是session这个值 客户端没有取到
闭包客 2017-01-16
  • 打赏
  • 举报
回复
引用 6 楼 shenghongjun 的回复:
[quote=引用 5 楼 closurer 的回复:] 比如你在写在 DocumentCompleted 事件的处理函数里面,就可以获取 webBrowser1.Document.Cookie 的值。
这个我理解,即使在DocumentCompleted 事件里面完成 操作,获取到的依然为null, 服务器端是用session方式验证登录的

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (webBrowser1.ReadyState < WebBrowserReadyState.Complete) return;
            cookStr = webBrowser1.Document.Cookie;
        }
这个即使在登录成功之后 获取到的 依然为null.[/quote] 呃……这个可能性有很多。 有时候一个页面加载了,DocumentCompleted 会触发多次,可能因为有些异步加载的内容。 另外,session 是服务器端的概念,客户端是不需要理会的,客户端只需要关心 cookies 就行了。
  • 打赏
  • 举报
回复
贴出你“也抓包对比过了”的实际结果。
疯子de幸福 2017-01-14
  • 打赏
  • 举报
回复
在线等...

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧