none
我用request.BeginGetResponse(),得到的stream有问题 RRS feed

  • 问题

  • 我写了一个代理验证的程序,发现绝大多数返回的网页的stream都有问题。

    当我使用stream建立StreamReader的时候,它会有异常:“stream.Length”引发了“System.NotSupportedException”类型的异常。

    如果直接用stream.Read()的话,会出现异常:“请求被中止: 请求已被取消。”

    这是我用来连接的代码:

                    HttpWebRequest request = HttpWebRequest.Create("http://www.baidu.com") as HttpWebRequest;
                    request.KeepAlive = true;
                    request.ContentType = "application/x-www-form-urlencoded";
                    request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                    request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8";
                    request.Proxy = new WebProxy(this.ip + ":" + this.port);
         
                    // 自定义的ValidationRequestState类
                    // 保存了一些异步返回时候所需的原request的信息以及其他信息
                    ValidationRequestState state = new ValidationRequestState(request, this);
     
                    // 异步返回的请求
                    IAsyncResult result = request.BeginGetResponse(new AsyncCallback(OnRequestReturn), state);
    

    这是返回时候的处理函数

            // 返回的处理
            private void OnRequestReturn(IAsyncResult result)
            {
                // 把之前保存的信息提取出来
                ValidationRequestState state = result.AsyncState as ValidationRequestState;
                HttpWebRequest request = state.request;
                ProxyItem proxy = state.proxy;
                HttpWebResponse response;
                try
                {
                    // 在这里,有时候会异常有时候不会。
                    // 如果不异常,以后就能得到一个stream
                    response = (HttpWebResponse)request.EndGetResponse(result);
                }
                catch //(Exception e)
                {
                    if (proxy._validationFinished)
                        return;
                    proxy.lastState = "连接错误";
                    proxy.validationCount++;
                    proxy.failAfterLastSuccessCount++;
                    proxy.delay = -1;
                    this._validationFinished = true;
                    return;
                }
                // 验证结果
                // 这里得到的这个stream,它出的问题
                Stream stream = response.GetResponseStream();
                // 所以这个html也没法得到了。以后的代码就没用了
                string html = Common.StreamToString(stream, response.CharacterSet);
                // ......
            }

    2013年2月4日 2:26

答案