本帖最后由 yzmsb 于 2009-10-22 05:01:02 编辑

解决方案 »

  1.   

    软件实现的功能是: 先得到cookie然后再登陆网站并获取想要的数码。因为同步的效率不怎么样,所以我想用异步的。cookie得到了,可套用同步的post代码行不通。求解
      

  2.   

    this.godl("pcusertest","52653652",icookie);
     public void godl(string u,string p, string scookie, string icookie)
    参数好像有出入HttpWebRequest request = (HttpWebRequest)WebRequest.Create (http://www.microsoft.com );
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader reader = new StreamReader(response.GetResponseStream() );
    string str = reader.ReadToEnd();
    reader.Close();
    response.Close(); Stream resStream = wrp.GetResponseStream(); //总是在这里卡住
    StreamReader sr = new StreamReader(resStream, System.Text.Encoding.Default);
    改成
    StreamReader sr = new StreamReader(wrp.GetResponseStream());
      

  3.   

    如果是WINFORM,用多线程以同步方式处理,并封装成对象,返回时以事件返回,这样效率应该不错的,给你看一下我的代码,是一个数据采集的:
    /// <summary>
            /// 下载数据
            /// </summary>
            /// <param name="url"></param>
            void Download(Uri url)
            {
                WebResponse response = null;
                Stream stream = null;
                StreamReader reader = null;            try
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                                    request.AllowAutoRedirect = true;
                    request.MaximumAutomaticRedirections = 3;
                    request.UserAgent = "Mozilla/6.0 (MSIE 6.0; Windows NT 5.1)";
                    request.KeepAlive = true;
                    request.Timeout = m_manager.getTaskConfig.Timeout;
                    response = request.GetResponse();
                    stream = response.GetResponseStream();                //如果下载的是二进制                if (!response.ContentType.ToLower().StartsWith("text/"))
                    {
                        SaveBinaryFile(response);
                        return;
                    }
                    //如果下载的是文本格式就分析                //首先要读取文本                string buffer = "", line;
                    reader = new StreamReader(stream, m_manager.getTaskConfig.Encode);
                    while ((line = reader.ReadLine()) != null)
                    {
                        buffer += line + "\r\n";
                    }                if (buffer.Length <= BUFFER_MIN_SIZE)
                    {
                        Log.Info(string.Format("下载\"{0}\"失败,文件大小于3KB,下载终止,重新拨号", url));
                        m_manager.OnTaskBreak(m_currentUrl);
                    }
                    else
                    {
                        Log.Info("下载成功:" + url.ToString());
                        //处理下载的页面                    ProcessPage(buffer);
                    }
                }
                catch (WebException e)
                {
                    Log.Warn("下载错误:" + url.ToString() + "|" + e.ToString());
                    //Console.WriteLine("下载失败,错误:" + e);
                    return;
                }
                catch (IOException e)
                {
                    Log.Warn("下载错误:" + url.ToString() + "|" + e.ToString());
                    //Console.WriteLine("下载失败,错误:" + e);
                    return;
                }
                finally
                {
                    if (reader != null) reader.Close();
                    if (stream != null) stream.Close();
                    if (response != null) response.Close();
                }
            }
      

  4.   

    我怀疑你的用户名、密码或COOKIE取得有问题,你测试下,直接用godl方法,参数写死看看。
      

  5.   


    回复 三楼和五楼的网友,谢谢你们的回帖。直接加参数在botton里调用godl是正常的,返回内容也正常。获取cookie和用户名密码也正常的。public void godl(string u,string p, string scookie, string icookie) 
    参数好像有出入 
     这个sookie是我发帖时改动过的。不存在的。 
        Stream stream = httpWebRequest.GetRequestStream();  是这行卡住。这行前面的msg显示.后面的msg没显示。所以是这行卡住。昨没太困了搞错。对不起!
      

  6.   


    你好。当事件处理可能就是实现我要的目的的最佳方式,不过C#事件这块我完全不懂呢。异步request也是才开始学的。你的代码我看半天都理解不了是什么意思。真是郁闷。不过谢谢你代码!
      

  7.   

    也没功夫看了,我最近遇到的问题是因为.net2.0限制了httpWebRequest的并发访问最大数,
    在你的访问类中加入
    ServicePointManager.DefaultConnectionLimit = 100; 
    不然.net2.0默认为并发数为2个,
    稍微看了下你的解释,我想八成是这个问题
    具体并发数自己设置就好了,建议不要操作线程池的数量。。
      

  8.   


    不是的呀。并发数我设了999呢。不过也同这个有点像。我的是在异步方法里再执行一个httprequest方法。