公共类,httphelper.cs:
    /// <summary>
    /// POST提交数据
    /// </summary>
    /// <param name="Url">post地址</param>
    /// <param name="postDataStr">要提交的数据</param>
    /// <param name="refrere">来路</param>
    /// <param name="isutf8">是否是utf8</param>
    /// <param name="sendmode">普通提交还是内容提交,例如文章提交要设为True</param>
    /// <param name="cookie">CookieContainer,cookie容器</param>
    /// <param name="timeout">超时时间,秒为单位</param>
    /// <param name="useragent">客户端信息</param>
    /// <param name="isPostOnGzip">是否启用Gzip压缩</param>
    /// <returns>返回提交后数据</returns>
    ///  
    ///public static string HttpPOST(string Url, string proxystr, string postDataStr, string refrere, bool isutf8, bool sendmode, ref  CookieContainer cookie, int timeout, string useragent, bool isPostOnGzip)
    public static string HttpPOST(string Url, string postDataStr, string refrere, bool isutf8, bool sendmode, ref  CookieContainer cookie, int timeout, string useragent, bool isPostOnGzip)
    {        string cstr = "提交前Cookie:" + cookie.GetCookieHeader(new Uri(Url));  //定义字符串保存提交前后的cookie数据,用于分析
        Stream myResponseStream = null; //定义服务器返回流
        HttpWebResponse response = null;  //定义服务器返回的请求
        HttpWebRequest request = null;//定义提交请求
        try
        {
            WebProxy proxy = new WebProxy();
            System.Net.ServicePointManager.Expect100Continue = false;//当要POST的数据大于1024字节的时候,是否分成两步
            System.Net.ServicePointManager.DefaultConnectionLimit = 1000;//设置最大并发连接,避免同时多个提交时出现失败
            request = (HttpWebRequest)WebRequest.CreateDefault(new Uri(Url));//根据当前url初始化请求
            request.ServicePoint.Expect100Continue = false;////当要POST的数据大于1024字节的时候,是否分成两步
            /*if (proxystr.Length > 0)
            {
                proxy = new WebProxy(proxystr);
                request.Proxy = proxy;
            }
            */
            request.CookieContainer = cookie;//设置cookie容器
            request.Method = "POST";//设置提交方式
            if (isPostOnGzip)
                request.AutomaticDecompression = DecompressionMethods.GZip;
            if (sendmode)//如果是内容提交,则加上此格式,这个是必须的,否则类似文章发布这样的提交无法被服务器识别
            {
                string split = postDataStr.Substring(postDataStr.IndexOf("-----------------------------") + 29);
                split = split.Remove(split.IndexOf("\n"));
                request.ContentType = "multipart/form-data; boundary=---------------------------" + split;            }
            else
            {
                request.ContentType = "application/x-www-form-urlencoded";//普通提交例如登录这样的,加上此格式
            }
            request.Referer = refrere;//设置来路
            request.Timeout = timeout * 1000;//设置超时时间,毫秒
            request.AllowAutoRedirect = false;//是否跟随重定向
            request.Accept = "*/*";//设置标头
            request.Headers.Add("Accept-Language", "zh-CN");//设置标头
            request.Headers.Add("Cache-Control", "no-cache");//设置标头
            request.UserAgent = useragent;//设置标头,客户端信息
            byte[] requestBytes = isutf8 ? System.Text.Encoding.UTF8.GetBytes(postDataStr) : System.Text.Encoding.Default.GetBytes(postDataStr);//根据指定的编码将要提交的数据变成字节数组
            request.ContentLength = requestBytes.Length;//设置请求的长度
            string header = request.Headers.ToString();//设置请求的头
            Stream myRequestStream = request.GetRequestStream();//获取提交流
            using (Stream writer = myRequestStream)
            {
                writer.Write(requestBytes, 0, requestBytes.Length);//提交数据到服务器
            }
            response = (HttpWebResponse)request.GetResponse();//获取服务器返回
            myResponseStream = response.GetResponseStream();//获取服务器返回流
            if (response.ContentEncoding.ToLower().Contains("gzip"))//如果是gzip,则用gzip的方式解压流
            {
                myResponseStream = new GZipStream(myResponseStream, CompressionMode.Decompress);
            }
            else if (response.ContentEncoding.ToLower().Contains("deflate"))
            {
                myResponseStream = new DeflateStream(myResponseStream, CompressionMode.Decompress);
            }
            string retString = isutf8 ? (new StreamReader(myResponseStream, Encoding.UTF8)).ReadToEnd() : (new StreamReader(myResponseStream, Encoding.Default)).ReadToEnd();//根据指定的编码将服务器返回流转换成字符串
            cstr += "\r\n提交后Cookie:" + cookie.GetCookieHeader(new Uri(Url));//拼接提交后cookie,用于分析
            retString = retString + "\r\n\r\n=================================================\r\n\r\n本次请求:" + Url + " 响应结果:" + response.StatusCode + "\r\n\r\n" + cstr + "\r\n" + request.CookieContainer.GetCookieHeader(new Uri(Url)) + "\r\nrequest:\r\n" + header + "\r\nresponse:\r\n" + response.Headers.ToString() + "\r\n\r\n=================================================\r\n\r\n";
            UpdateCookie(ref cookie, response.Cookies);//将post成功以后得到的新cookie放入cookie容器里面
            return retString;
        }
        catch (Exception ex)
        {
            return ex.Message;//如果报错,返回错误信息
        }
        finally
        {//最后关闭各种流,各种请求,这里不管报不报错都会最终执行
            if (myResponseStream != null)
                myResponseStream.Close();
            if (response != null)
                response.Close();
            if (request != null)
                request.Abort();
        }
    }

解决方案 »

  1.   

    公共类HttpGET方法
        /// <summary>
        /// GET获取数据
        /// </summary>
        /// <param name="Url">get地址</param>
        /// <param name="refrere">来路</param>
        /// <param name="encoding">编码,1:默认,2:utf8,3:智能识别</param>
        /// <param name="cookie">CookieContainer,cookie容器</param>
        /// <param name="timeout">超时时间,秒为单位</param>
        /// <param name="useragent">客户端信息</param>
        /// <returns>返回get后获取到的字符串</returns>
        public static string HttpGET(string Url, string proxystr, string refrere, int encoding, ref  CookieContainer cookie, int timeout, string useragent)
        {
            WebProxy proxy = new WebProxy();
            string cstr = "提交前Cookie:" + cookie.GetCookieHeader(new Uri(Url));  //定义字符串保存提交前后的cookie数据,用于分析
            Stream myResponseStream = null; //定义服务器返回流        HttpWebResponse response = null;  //定义服务器返回的请求        HttpWebRequest request = null;//定义提交请求
            try
            {
                System.Net.ServicePointManager.Expect100Continue = false;
                System.Net.ServicePointManager.DefaultConnectionLimit = 1000;
                request = (HttpWebRequest)WebRequest.Create(Url);
                request.Headers.Clear();
                request.CookieContainer = cookie;
                request.Method = "GET";
                request.AutomaticDecompression = DecompressionMethods.GZip;
                request.Referer = refrere;
                request.Timeout = timeout * 1000;
                request.AllowAutoRedirect = false;
                request.Accept = "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
                request.Headers.Add("Accept-Language", "zh-cn");
                request.UserAgent = useragent;
                if (proxystr.Length > 0)
                {
                    proxy = new WebProxy(proxystr);
                    request.Proxy = proxy;
                }
                string header = request.Headers.ToString();
                response = (HttpWebResponse)request.GetResponse();
                myResponseStream = response.GetResponseStream();
                UpdateCookie(ref cookie, response.Cookies);//请求成功以后,将新cookie放入到容器里面
                string retString = "";
                if (response.ContentEncoding.ToLower().Contains("gzip"))
                {
                    myResponseStream = new GZipStream(myResponseStream, CompressionMode.Decompress);
                }
                else if (response.ContentEncoding.ToLower().Contains("deflate"))
                {
                    myResponseStream = new DeflateStream(myResponseStream, CompressionMode.Decompress);
                }
                Encoding encode = Encoding.Default;            if (encoding == 1)//如果是1,使用默认编码读取返回流
                {
                    encode = Encoding.Default;
                    StreamReader sr = new StreamReader(myResponseStream, encode);
                    retString = sr.ReadToEnd();
                }
                else if (encoding == 2)//如果是2,使用utf8编码读取返回流
                {
                    encode = Encoding.UTF8;
                    StreamReader sr = new StreamReader(myResponseStream, encode);
                    retString = sr.ReadToEnd();
                }
                else//其他,智能获取编码并且读取返回流
                {
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        MemoryStream msTemp = new MemoryStream();
                        int len = 0;
                        byte[] buff = new byte[512];
                        while ((len = myResponseStream.Read(buff, 0, 512)) > 0)
                        {
                            msTemp.Write(buff, 0, len);
                        }
                        response.Close();
                        if (msTemp.Length > 0)
                        {
                            msTemp.Seek(0, SeekOrigin.Begin);
                            byte[] PageBytes = new byte[msTemp.Length];
                            msTemp.Read(PageBytes, 0, PageBytes.Length);
                            msTemp.Seek(0, SeekOrigin.Begin);                        retString = System.Text.Encoding.UTF8.GetString(PageBytes);
                            bool getok = false;
                            try
                            {
                                Regex rg = new Regex("(?<=charset=).*?(?=\")");                            MatchCollection conn = rg.Matches(retString);
                                if (conn.Count > 0)
                                    getok = true;
                                if (conn.Count > 0 && encode != Encoding.GetEncoding(conn[0].Value.ToString()))
                                {
                                    encode = Encoding.GetEncoding(conn[0].Value.ToString());                            }
                            }
                            catch { }
                            if (!getok)
                            {
                                if (Regex.Matches(retString, "[\u4e00-\u9fa5]").Count < 10)
                                {
                                    retString = Encoding.Default.GetString(PageBytes);
                                }
                            }
                            else
                            {
                                if (encode != Encoding.UTF8)
                                    retString = encode.GetString(PageBytes);
                            }
                        }
                    }
                }
                cstr += "\r\n提交后Cookie:" + cookie.GetCookieHeader(new Uri(Url));
                retString = retString + "\r\n\r\n=================================================\r\n\r\n本次请求:" + Url + " 响应结果:" + response.StatusCode + "\r\n\r\n" + cstr + "\r\n\r\n" + request.CookieContainer.Count + "\r\n" + request.CookieContainer.GetCookieHeader(new Uri(Url)) + "\r\nrequest:\r\n" + header + "\r\nresponse:\r\n" + response.Headers.ToString() + "\r\n\r\n=================================================\r\n\r\n";
                return retString;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            finally
            {
                if (myResponseStream != null)
                    myResponseStream.Close();
                if (response != null)
                    response.Close();
                if (request != null)
                    request.Abort();
            }
        }
      

  2.   

    代码贴完了啊,
    UpdateCookie(ref cookie, response.Cookies);//将post成功以后得到的新cookie放入cookie容器里面
    这方法在哪的都没贴出来