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请求远程网页的做法不是一个科学可靠的设计方案,
    这样做不稳定而且风险巨大,一定数量级的频繁请求肯定会出问题。程序需要的数据最好还是预先放在数据库中做持久化处理
    
  • 相关阅读:
    CentOS7安装Jenkins与配置
    pycharm的安装与配置
    python 3环境的搭建
    VMware workstation虚拟机与真机之间复制文件
    博客中添加图片查看器(支持图片查看、放大、缩小、翻转、切换、旋转)
    layui table 表格由于数据源问题部分数据无法渲染 ——数据源中有 length 字段
    初识Nginx——前后端发布、Nginx反向代理
    mui 的第一次使用体验以及遇到问题
    MyBatis 项目运行报错“No typehandler found for property ”
    U8登录 TQLoginHelper 调用目标发生异常
  • 原文地址:https://www.cnblogs.com/sntetwt/p/3501590.html
Copyright © 2011-2022 走看看