[转]HttpWebRequest提高效率之连接数,代理,自动跳转,gzip请求等设置有关问题

[转]HttpWebRequest提高效率之连接数,代理,自动跳转,gzip请求等设置有关问题

www.MyException.Cn   发布于:2012-09-15 19:09:29   浏览:7次
 
[记录]HttpWebRequest提高效率之连接数,代理,自动跳转,gzip请求等设置问题

先设置4个:

               

 webrequest.ServicePoint.Expect100Continue = false;
                //是否使用 Nagle 不使用 提高效率
                webrequest.ServicePoint.UseNagleAlgorithm = false;
                //最大连接数
                webrequest.ServicePoint.ConnectionLimit = 65500;
                //数据是否缓冲 false 提高效率 
                webrequest.AllowWriteStreamBuffering = false;


 

代理的使用:我用的代理都是不要账号和密码的,因为要不是免费的,要是是我们自己的,对来访IP 有限制

            

 if (proxy!=null)
                {
                    model.proxy = proxy;
                    WebProxy myProxy = new WebProxy(proxy.ProxyInfo, false);
                    myProxy.Credentials = new NetworkCredential("", "");
                    webrequest.Proxy = myProxy;
                }
                else
                {
                    webrequest.Proxy = GlobalProxySelection.GetEmptyWebProxy();
                }

 

webrequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");

带上gzip,如果对方支持gzip,流量上可以节省五分之四,原来250KB,用gzip压缩有 大概在50KB,减少带宽压力,增加速度

值得注意的是,如果是gzip,返回值必须要gzip解压的。

 

 if (response.ContentEncoding.ToLower().Contains("gzip"))
                    {
                        using (GZipStream stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))
                        {
                            using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                            {

                                model.html = reader.ReadToEnd();
                            }
                        }
                    }

 

还有一点:gzip解压的时候回耗费CPU,所以这个需要注意下

 

附完成方法

 

 

 /// <summary>
        /// Get 方式 获取数据
        /// </summary>
        /// <param name="webUrl"></param>
        /// <returns></returns>
        public Model.WebRequestReturnModel WebRequestGetHtmlByGet(string webUrl, CookieContainer cookieContainer, Encoding encoding, string refer,Model.Proxy proxy)
        {
            Model.WebRequestReturnModel model = new Model.WebRequestReturnModel();
            HttpWebRequest webrequest = null;
            try
            {
                webrequest = WebRequest.Create(webUrl) as HttpWebRequest;
                
                webrequest.ServicePoint.Expect100Continue = false;
                 webrequest.ServicePoint.UseNagleAlgorithm = false;
                 webrequest.ServicePoint.ConnectionLimit = 65500;
                webrequest.AllowWriteStreamBuffering = false;
                if (proxy!=null)
                {
                    model.proxy = proxy;
                    WebProxy myProxy = new WebProxy(proxy.ProxyInfo, false);
                    myProxy.Credentials = new NetworkCredential("", "");
                    webrequest.Proxy = myProxy;
                }
                else
                {
                    webrequest.Proxy = GlobalProxySelection.GetEmptyWebProxy();
                }
                //设置其他的herader
                webrequest =WebRequestSetHeaders(webrequest);
                if (!String.IsNullOrEmpty(refer))
                {
                    webrequest.Referer = refer;
                }
                else
                {
                    webrequest.Referer = webUrl;
                }
                webrequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
                webrequest.CookieContainer = cookieContainer;
                webrequest.Timeout = 5000;
                webrequest.UserAgent = "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
                webrequest.Accept = "*/*";
                webrequest.KeepAlive = true;
                webrequest.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");

                using (HttpWebResponse response = (HttpWebResponse)webrequest.GetResponse())
                {

                    if (response.ContentEncoding.ToLower().Contains("gzip"))
                    {
                        using (GZipStream stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))
                        {
                            using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                            {

                                model.html = reader.ReadToEnd();
                            }
                        }
                    }
                    else if (response.ContentEncoding.ToLower().Contains("deflate"))
                    {
                        using (DeflateStream stream = new DeflateStream(response.GetResponseStream(), CompressionMode.Decompress))
                        {
                            using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                            {

                                model.html = reader.ReadToEnd();
                            }

                        }
                    }
                    else
                    {
                        using (Stream stream = response.GetResponseStream())
                        {
                            using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                            {

                                model.html = reader.ReadToEnd();
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                model.exception = ex;
                model.html = string.Empty;

            }
            model.cookieContainer = cookieContainer;
            return model;
        }


 

转载于:https://www.cnblogs.com/yanzhenan/archive/2013/05/24/3096236.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HttpWebRequest是一个.NET Framework中的类,用于向Web服务器发送HTTP请求请求正文是指在HTTP请求中发送的数据,通常是POST请求中的表单数据或JSON数据等。可以使用HttpWebRequest的GetRequestStream方法获取请求正文流,然后将数据写入流中发送到服务器。在接收服务器响应时,可以使用HttpWebRequest的GetResponse方法获取响应流,然后从流中读取响应正文。 ### 回答2: HttpWebRequest请求是通过发送HTTP协议包的形式与WebServer进行通信,用于向Web服务器发送请求并获取响应。请求正文是HttpWebRequest请求中的一部分,负责传递与请求相关的数据。对于一些Web应用场景,经常需要使用请求正文来进行数据的传输,例如上传文件、提交表单数据等。 请求正文的构造主要有两种方式:表单方式和流方式。表单方式主要用于发送数据量较小的请求,可以直接通过HttpWebRequest的GetRequestStream()方法获取请求流,然后将表单数据换为字节数组写入请求流中即可。在请求表单中我们经常使用键值对的形式传递数据。 每个请求必须有一个有效的Content-Length头,它指定请求body的字节数(除了multipart/form-data,你也可以这样expression,因为它有multipart的请求边界). 所以在表单中必须要指定Content-Length. 因为Web服务器会根据Content-Length来判断请求是否已经完整接收到,并在已接收到完整请求之后才会开始处理请求,并返回相应的响应数据,否则请求将被认为是不完整的并被拒绝。 流方式则主要用于发送数据量较大的请求,例如文件上传和下载。在流方式的请求中,需要获取HttpWebRequest的GetRequestStream()方法返回的请求流,然后将上传文件的字节流写入请求流中,实际上这个操作也是以字节数组的形式将数据写入请求流中,只不过字节数组的内容从表单数据换为文件字节流。 总之,请求正文在HttpWebRequest请求中起着至关重要的作用,负责传输数据和携带相关的参数信息,我们在进行HttpWebRequest开发时,可以根据具体的应用场景选择合适的构造方式进行请求数据的传输。同时,我们也需要注意请求的完整性和正确性,保证请求正文中的数据与实际需要传输的数据保持一致。 ### 回答3: HttpWebRequest请求正文是指在发送HTTP请求时,需要发送的数据内容。通常,发送HTTP请求的时候,需要向服务器发送一些数据,比如表单数据、XML数据、JSON数据等等。这些数据需要封装在请求的正文中发送。 在使用HttpWebRequest发送POST请求时,需要将请求的数据存储在请求的正文中。HttpWebRequest提供了多种方法来设置请求的正文,包括设置请求正文的内容类型、设置字符编码、设置数据流等。下面是常用方法的介绍: 1.设置请求正文的内容类型 使用HttpWebRequest的ContentType属性来设置请求正文的内容类型,常见的内容类型包括application/x-www-form-urlencoded、application/json、text/xml等。 2.设置字符编码 发送POST请求时,需要将请求正文的数据编码成字节数组。使用Encoding类来进行字符编码。 3.设置请求正文数据流 使用HttpWebRequest的GetRequestStream方法获取请求正文对应的数据流,通过读写数据流来设置请求正文。 综上所述,请求正文是HTTP请求中必不可少的一部分,HttpWebRequest提供了多种方法来设置请求正文,以满足不同的需求。在使用HttpWebRequest发送HTTP请求时,需要了解如何设置请求正文,以确保请求能够成功发送和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值