有过这方面经验的兄弟们回复一下。。我用HttpWebRequest模拟某网站的登录,用户名和密码是post方法提交的。
它在登录成功后并没有立即写入cookie,而是在Response的HTML中,通过请求图片URL和js脚本访问别的网址,根据session再写cookie。
由于这网站包括论坛和其它模块(包括子域名和别的域名,五六个吧),所以有多个分别写入cookie的请求对应各个子模块,做的单点登录。比如:
通过请求<img src="http://www.a.com/verify/?一些参数.." />写入cookie "web_member_id";
通过请求<script type="text/javascript" src="http://bbs.a.com/verify/?一些参数.."></script>写入cookie "bbs_member_id";
我只用到网站的,就再次请求写入网站cookie的js,把cookie写入CookieContainer,浏览登录后的页面都没问题。
问题出在下一步,我要发布一些东西到后台(保存到数据库),post提交表单时,报"Restricted access!"访问受限。。用HttpAnalyzer查看构造的post Data跟在浏览器中真实提交的真实数据是一样的,只是cookie不一样。
Reissue Request重新发送请求,模拟提交总是Restricted access,真实提交总是成功。我猜测原因如下:
1.cookie中缺少东西。所以我打算把所有的cookie都写入,模拟真实的登录。
在获得登录成功后响应的HTML中,因为它有多个写入cookie的请求,我觉得用正则表达式提出来分别去请求一遍太费事了,有没有办法执行这段html取得全部的cookie保存下来?
注意,我这项目是个后台服务,所以没有界面,也就用不到WebBrowser控件。2.该网站有别的限制模拟提交的方法。
这方面完全无法着手啊。
这网站是用php写的。

解决方案 »

  1.   

    HttpWebRequest 的方式的话表示你还得自己去解析获得到的 response HTML, 然后逐个再用 HttpWebRequest 去请求这些URL才能写COOKIE,因为你不具备执行HTML的能力,必须全套模拟它的做法
      

  2.   

    感谢#1楼哥们回复。对啊,我就是想问,有没办法执行这响应的html,而不是分析出URL一个个去请求
      

  3.   

    .net 4.0 之前的 CookieContainer 有bug,你可以直接通过 HttpResponse.Headers["Set-Cookie"] 取cookie字符串而不是通过 CookieContainer 来操作。
      

  4.   

    #3楼,
    谢谢。
    通过HttpAnalyzer截获的结果看,CookieContainer没什么问题,只是我故意少写入了一些觉得可能无关的cookie项,因为这网站写全部的cookie要分别请求七、八次,太费事。
    我的项目是一键发布到同行业的多个网站,这只是其中一个网站,不能响应太慢。
    我试下不用CookieContainer,遍历cookie写入吧,不过应该不是这原因。
      

  5.   

    我用HttpAnalyzer把正常提交的cookie一项项地去掉重发请求,找到了结果,确实是少了个cookie项,多请求一张图片解决了。
    结帖了