各位,请问我想在程序中访问需要登陆的网站的源代码,在程序中webbrowser登陆后,自动后台察看本站源码。
我采用一些朋友说的保存cookie,附加到请求中,可行,但是有些网站读不到cookie,或cookie有问题,读不全的问题。
//在WebBrowser中登录 cookie保存在 WebBrowser.Document.Cookie中
            
             CookieContainer myCookieContainer = new CookieContainer();             //String 的Cookie 要转成 Cookie型的 并放入CookieContainer中
             string cookieStr = webBrowser1.Document.Cookie;
             string[] cookstr = cookieStr.Split(';');
             foreach (string str in cookstr)
             {
                 string[] cookieNameValue = str.Split('=');
                 Cookie ck = new Cookie(cookieNameValue[0].Trim().ToString(), cookieNameValue[1].Trim().ToString());
                 ck.Domain = "www.abc.com";//必须写对
                 myCookieContainer.Add(ck);
             }             HttpWebRequest hreq = (HttpWebRequest)HttpWebRequest.Create("http://www.abc.com/search.asp");
             hreq.Method = "POST";
             hreq.ContentType = "application/x-www-form-urlencoded";
           
             //自己创建的CookieContainer
             hreq.CookieContainer = myCookieContainer;
           
             string postdata = "id=2005&action=search&name=";
             byte[] byte1 = Encoding.ASCII.GetBytes(postdata);
             hreq.ContentLength = byte1.Length;
            
             Stream poststream = hreq.GetRequestStream();
             poststream.Write(byte1, 0, byte1.Length);
             poststream.Close();
        
             HttpWebResponse hres = (HttpWebResponse)hreq.GetResponse();
有些问题:如cookie:ASPSESSIONIDSSCTBTDS=MJAPHPLCKDLMOHGKNBIMLMPD; company=password=lvtong&id=2032不能写入,
另外还有没有别的思路来保留登陆状态!

解决方案 »

  1.   

    company=password=lvtong&id=2032不能写入, 
    如果写不成,为什么不用socket,为什么非要使用HttpWebRequest呢!
    是做网络蜘蛛的吧!
    你以为现成的就那么好用!
    还有的网站,cookie是动态变化的,有的是通过网页中的javascript来设置的!
    你需要分情况!
    上面的问题,你就不要使用 hreq.CookieContainer = myCookieContainer; 了,
    HttpWebRequest里边不是还有header.add方法吗?逐步添加吧!
      

  2.   

    你每次访问都使用一个新的cookie container?那不是没保存状态么?
      

  3.   

    您是说这种方式还是不太好的,我同意。只是我对网络编程不太了解,单位又催得紧,没办法深究了。
    可以大概介绍下socket在这方面的使用吗?
      

  4.   

    cookie的安全性能不好,有些时候不适合用的。有别的方式保存状态的例如session,隐藏域控件.....看你有什么条件了
      

  5.   

    使用socket,虽然可以摆平你说的这个问题,但是总体上还是比较麻烦的,因为,你需要解析http协议。
      

  6.   

    谁有比较好的socket例子,保持登陆状态相关的,我清兜了。分全给了
      

  7.   


    ............不是我不告诉你,貌似:“还可以,我知道了,谢谢” 不是我写的。因为这个号,别人也在上。另外,我不太会用WebBrower,我用HttpWebRequest...
      

  8.   

    HttpWebRequest...就是这个啊,我得不到登陆页面的cookie是因为什么?
    webbrowser.document.cookie是空的,怎么回事?
    我就在上面登陆的,却得不到东西,怎么办?
      

  9.   


    被你打败了。 很抱歉,没有仔细看你的问题。另外,你可以看一下这段代码:  string strLoginUrl = "提交地址";
                string strLoginUrlPost = "提交内容";            HttpWebRequest reqLogin = (HttpWebRequest)WebRequest.Create(strLoginUrl);
                reqLogin.KeepAlive = true;
                reqLogin.Method = "POST";
                reqLogin.AllowAutoRedirect = true;
                reqLogin.UseDefaultCredentials = true;
               // reqLogin.Referer = strLoginPageUrlReferer;
                reqLogin.UserAgent ="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 1.1.4322; .NET CLR 3.5.20404)";
                reqLogin.ContentType =  "application/x-www-form-urlencoded";
                reqLogin.CookieContainer = new CookieContainer();
                //reqLogin.CookieContainer.Add(ccFirstPage);
                reqLogin.ContentLength = strLoginUrlPost.Length;
                //POST 提交
                StreamWriter sw2 = new StreamWriter(reqLogin.GetRequestStream());
                sw2.Write(strLoginUrlPost);
                sw2.Close();
                //得到提交之后的返回数据
                HttpWebResponse resLogin = (HttpWebResponse)reqLogin.GetResponse();
                resLogin.Cookies = reqLogin.CookieContainer.GetCookies(reqLogin.RequestUri);
                //返回的Header
                Debug.Write("\n Header >> " + reqLogin.Headers.ToString());
                StreamReader sr2 = new StreamReader(resLogin.GetResponseStream());
                String strAftLoginPage = sr2.ReadToEnd();
                sr2.Close();
                CookieCollection ccLogin = new CookieCollection();
                ccLogin.Add(resLogin.Cookies);
                //response url url 
                string strREsponseUrlTemp = resLogin.ResponseUri.ToString();
                resLogin.Close();
                reqLogin.Abort();
      

  10.   

    我现在放弃这个了,因为有些网站得不到cookie,有高人说用socket,那位有着方面的相关代码,分享看看
    必有重谢!!!!
      

  11.   

    呵呵,lz还在研究这个啊,我又现成的例子,联系我[email protected],我给你源码