zoukankan      html  css  js  c++  java
  • 我的webrequest经验

    1  webrequest 是什么:编程方式模拟web请求,利用webrequest可以实现 相当于一个浏览器请求一个网页的效果,但是它始终是模拟请求,
    与浏览器输入框输入网址请求不一样。
    2 程序设计中有时有这样的case,需要请求一个url,获得特定网页的部分html代码,比如特定的table,div片段。
    这个时候可以用代码实现一个httpwebrequest请求,以get的方式请求远程站点的一个url,返回结果是网页的整个html,之后再在结果中提取我们需要的数据。
    代码如下
        
    
    #region WebRequest请求url
          /// <summary>
          /// WebRequest请求url
          /// </summary>
          /// <param name="reqUrl">服务端URl</param>
          /// <param name="method">方法大写(POST)</param>
          /// <returns>返回Xml格式字符串</returns>
          public string CreateRequest(string reqUrl, string method, string param)
          {
              string error = string.Empty;
              string resultStr = string.Empty;
              HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create(reqUrl);
              webReq.Method = method;
              webReq.KeepAlive = true;
              webReq.Timeout = 20000;
              webReq.ContentType = "text/html";//application/x-www-form-urlencoded
              webReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
              if (method == "POST")
              {
                  byte[] bs = Encoding.ASCII.GetBytes(param);
                  webReq.ContentLength = bs.Length;
                  using (Stream reqStream = webReq.GetRequestStream())
                  {
                      reqStream.Write(bs, 0, bs.Length);
                  }
              }
              using (HttpWebResponse response = (HttpWebResponse)webReq.GetResponse())
              {
                  using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                  {
                      resultStr = reader.ReadToEnd();
                  }
     
                  if (response != null)
                      response.Close();
              }
              return GetChartSize(resultStr);
          }
          #endregion
    在远程站点服务器不做任何限制的情况下,这样的单个请求一般都会成功。
    有几种情况需要注意。
    1 整个过程是一个客户端服务端的完整请求,请求结束后要记得关闭连接,使用using是一个好的习惯。否则后果很严重
    2 我做过的关于webrequest的几个项目都涉及到循环请求web服务器,比如我是先得到一个产品信息列表,假设有一次200条,其中一条商品信息有一个url值,
    必须webrequest去请求网页获得一段html,之后我分析完这段html后再去请求,这样循环发送,相当于攻击了。一定数量的产品信息列表就可以循环发起请求了。一段时间后不稳定情况就出现了。
    明明存在的url,在请求的时候就报url不存在了。
    原因:但某一个请求一段时间后得不到回应,请求会中断,之后的请求也就失败了:
    The remote server returned an error: (404) Not Found.
    at System.Net.HttpWebRequest.GetResponse()
    实际上根本是存在的url
    3  .NET对连接有数最的限制,可以设置ServicePointManager.DefaultConnectionLimit修改限制数量。
    频繁的请求可能跟连接限制有关系,我对.NET连接限制的原理不是很清楚,在我的代码和webconfig分别把这个连接数设置为
    512,结果没有起任何作用。
    我自己测试ServicePointManager.DefaultConnectionLimit的默认值是21
    4 关于这个问题的一些参考资料
    》http://www.cnblogs.com/Thriving-Country/archive/2009/12/18/1627008.html
    这里详细的解释了并发连接,
    http://q.cnblogs.com/q/34850/
    http://topic.csdn.net/u/20070403/15/e2fc87fb-4795-4c50-9c21-934a46079e62.html
    我的建议:
    根据我自己的经验,循环使用webrequest请求远程网页的做法不是一个科学可靠的设计方案,
    这样做不稳定而且风险巨大,一定数量级的频繁请求肯定会出问题。程序需要的数据最好还是预先放在数据库中做持久化处理
    
  • 相关阅读:
    笔记44 Hibernate快速入门(一)
    tomcat 启用https协议
    笔记43 Spring Security简介
    笔记43 Spring Web Flow——订购披萨应用详解
    笔记42 Spring Web Flow——Demo(2)
    笔记41 Spring Web Flow——Demo
    Perfect Squares
    Factorial Trailing Zeroes
    Excel Sheet Column Title
    Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/sntetwt/p/3501590.html
Copyright © 2011-2022 走看看