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请求远程网页的做法不是一个科学可靠的设计方案,
这样做不稳定而且风险巨大,一定数量级的频繁请求肯定会出问题。程序需要的数据最好还是预先放在数据库中做持久化处理

我的webrequest经验的更多相关文章

  1. 移动硬盘不能识别的常见7种解决方案 ~ By 逆天经验

    服务器汇总:http://www.cnblogs.com/dunitian/p/4822808.html#iis 服务器异常: http://www.cnblogs.com/dunitian/p/45 ...

  2. 【原创经验分享】WCF之消息队列

    最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...

  3. 用WebRequest +HtmlAgilityPack 从外网抓取数据到本地

    相信大家对于WebRequest 并不陌生,我们在C#中发请求的方式,就是创建一个WebRequest .那么如果我们想发一个请求到外网,比如国内上不了的一些网站,那么该怎么做呢? 其实WebRequ ...

  4. iOS架构一个中型普通App的一些经验总结

    这一版比较完善的的App终于提交审核了.有时间写写自己的一些经验的总结了.自己主导的从0到比较成型的app到目前来说也只有两个,但是其中的很多东西都是大同小异.基本上是想到了什么就写什么,感觉写的不到 ...

  5. 从史上八大MySQL事故中学到的经验

    本文列举了史上八大MySQL宕机事件原因.影响以及人们从中学到的经验,文中用地震级数来类比宕机事件的严重性和后果,排在最严重层级前两位的是由于亚马逊AWS宕机故障(相当于地震十级和九级). 一.Per ...

  6. CentOS上 Mono 3.2.8运行ASP.NET MVC4经验

    周一到周三,折腾了两天半的时间,经历几次周折,在小蝶惊鸿的鼎力帮助下,终于在Mono 3.2.8上运行成功MVC4.在此总结经验如下: 系统平台的版本: CentOS 6.5 Mono 3.2.8 J ...

  7. 【腾讯Bugly经验分享】程序员的成长离不开哪些软技能?

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ce8068d4d44a246f72baf2 Dev Club 是一个交流移动 ...

  8. CI Weekly #6 | 再谈 Docker / CI / CD 实践经验

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  9. C#异常处理经验(原则与方法)

         本文是异常处理经验性的文章,其实跟C#关系也不大.比较适合刚刚熟悉异常语法,而缺乏实战的读者.当然,经验老练的读者也可指出不足.给予意见.补充说明,一起完善文章,分享更多知识与经验.   1 ...

随机推荐

  1. log4j deadlock

    用了这么久的Log4j这次倒下了,而且官方也还没有给出解决方案. 描述:tomcat 经过一天多时间的访问,出现了hang ,使用 Jstack 查看堆栈后,发现现成 blocked ,主要是 Log ...

  2. ORACLE数据库导入的时候出现IMP-00038: 无法转换为环境字符集句柄

    数据泵不一致导致的,比如说你用expdp导出来的 用imp导入的时候就会出现这个错误exp导出来的用imp导入expbd导出来的用impdp导入和版本没有关系

  3. ExtJS动态设置表头

    if(document.getElementById("lxdj_radio").checked){ colQd = new Ext.grid.ColumnModel(colMAr ...

  4. Asp.Net中使用Couchbase——Memcached缓存入门篇

    本文个人同步博客地址: http://aehyok.com/Blog/Detail/96.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文 ...

  5. 标准输出中stderr和stdout的区别

    一.首先介绍一下三者printf,sprintf,fprintf的功能 1,printf就是标准输出,在屏幕上打印出一段字符串来. 2,sprintf就是把格式化的数据写入到某个字符串中.返回值字符串 ...

  6. 突发奇想之:源码及文档,文档包括源码---xml格式的源码,文档源码合并;注释文档化,文档代码化;

    目前源码和文档一般都是分开的,我在想为什么 源码不就是最好的文档么? 但是一般源码都是文本text的,格式化需要人为统一规范,所以源码中的文档在现实中不是那么的易于实践. 而且 源码 不能包括图片.附 ...

  7. C#中的自动赋值

    工作中用到对同一个类型的对象的赋值,需要逐个属性的赋值赋过去,在网上找了很久没发觉合适的,就自己动手写了个,以做备忘用. protected void AutoAssign(object from , ...

  8. swift3.0:NSURLSession的使用

    一.说明 NSURLSession是OC中的会话类,在Swift中变成URLSession类,它们的实现方式是一样的,下面的示例就Swift语法进行讲解和介绍. 二.介绍: URLSession 类支 ...

  9. Python json模块dumps loads

    python中json数据的使用. dumps和loads也是需要成对使用的,就像c++ new/delete malloc/free一样需要成对使用. 看着像json的字符串,也不一定是json字符 ...

  10. C++ 内置宏定义 与 预编译指令

    内置宏和预编译指令, 在代码调试.单元测试.跨平台代码中经常会用到.这里记录一下. 1. 内置宏 (文件名,当前行号,当前日期,当前时间,当前执行方法名) __FILE____LINE____DATE ...