我的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请求远程网页的做法不是一个科学可靠的设计方案,
这样做不稳定而且风险巨大,一定数量级的频繁请求肯定会出问题。程序需要的数据最好还是预先放在数据库中做持久化处理
我的webrequest经验的更多相关文章
- 移动硬盘不能识别的常见7种解决方案 ~ By 逆天经验
服务器汇总:http://www.cnblogs.com/dunitian/p/4822808.html#iis 服务器异常: http://www.cnblogs.com/dunitian/p/45 ...
- 【原创经验分享】WCF之消息队列
最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...
- 用WebRequest +HtmlAgilityPack 从外网抓取数据到本地
相信大家对于WebRequest 并不陌生,我们在C#中发请求的方式,就是创建一个WebRequest .那么如果我们想发一个请求到外网,比如国内上不了的一些网站,那么该怎么做呢? 其实WebRequ ...
- iOS架构一个中型普通App的一些经验总结
这一版比较完善的的App终于提交审核了.有时间写写自己的一些经验的总结了.自己主导的从0到比较成型的app到目前来说也只有两个,但是其中的很多东西都是大同小异.基本上是想到了什么就写什么,感觉写的不到 ...
- 从史上八大MySQL事故中学到的经验
本文列举了史上八大MySQL宕机事件原因.影响以及人们从中学到的经验,文中用地震级数来类比宕机事件的严重性和后果,排在最严重层级前两位的是由于亚马逊AWS宕机故障(相当于地震十级和九级). 一.Per ...
- CentOS上 Mono 3.2.8运行ASP.NET MVC4经验
周一到周三,折腾了两天半的时间,经历几次周折,在小蝶惊鸿的鼎力帮助下,终于在Mono 3.2.8上运行成功MVC4.在此总结经验如下: 系统平台的版本: CentOS 6.5 Mono 3.2.8 J ...
- 【腾讯Bugly经验分享】程序员的成长离不开哪些软技能?
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ce8068d4d44a246f72baf2 Dev Club 是一个交流移动 ...
- CI Weekly #6 | 再谈 Docker / CI / CD 实践经验
CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...
- C#异常处理经验(原则与方法)
本文是异常处理经验性的文章,其实跟C#关系也不大.比较适合刚刚熟悉异常语法,而缺乏实战的读者.当然,经验老练的读者也可指出不足.给予意见.补充说明,一起完善文章,分享更多知识与经验. 1 ...
随机推荐
- ibatis.net:惯用法
使用<![CDATA[]]>保持SQL格式 IN 查询
- 【C++】STL常用容器总结之五:双端队列deque
6.双端队列deque 所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速.而在中间插入元素则会比较费时,因为必须移动中间其他的元素.双端队 ...
- SharePoint 2013 workflows stop working (Failed on started.)
前言 最近,使用工作流的时候碰到了一个问题,突然间所有工作流都无法启动,报错Failed on started. 同时,工作流内部报错,工作流被系统账号取消了. 查了很久,发现系统打了windows ...
- NSObject的hash方法
NSObject的hash方法 说明 本示例仅仅演示一个对象什么时候执行hash方法. 细节 1. 必要的Model类,重载了hash方法用以反映Hash方法是否被调用了 2. 测试 // // Vi ...
- ios成长之每日一遍(day 8)
这几天都有一些任务要跟, 把ios的学习拉后, 看看要抓紧咯, 看看轮到的学习的是UITableView. BIDAppDelegate.h #import <UIKit/UIKit.h> ...
- 单元测试利器 JUnit 4
引言 毋庸置疑,程序员要对自己编写的代码负责,您不仅要保证它能通过编译,正常地运行,而且要满足需求和设计预期的效果.单元测试正是验证代码行为是否满足预期的有效手段之一.但不可否认,做测试是件很枯燥无趣 ...
- [转]PHP资源列表
转自:http://www.cnblogs.com/CraryPrimitiveMan/p/4437272.html 一个PHP资源列表,内容包括:库.框架.模板.安全.代码分析.日志.第三方库.配置 ...
- java 常用集合list与Set、Map区别及适用场景总结
转载请备注出自于:http://blog.csdn.net/qq_22118507/article/details/51576319 list与Set.Map区别及 ...
- 【BZOJ】【3930】【CQOI2015】选数
数论/莫比乌斯反演/快速mu前缀和 比较容易想到令f[x]表示gcd=x的方案数,令g[x]表示x|gcd的方案数. 那么有$ g(d)=\sum_{d|n} f(n)$,根据莫比乌斯反演,有$f(d ...
- Log Shipping搭建
1. 概述 SQL Server 使用日志传送,您可以自动将“主服务器”实例上“主数据库”内的事务日志备份发送到单独“辅助服务器”实例上的一个或多个“辅助数据库”.事务日志备份分别应用于每个辅助 ...