我的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 ...
随机推荐
- nil coalescing operator
nil coalescing operator ?? 就是 optional和 三元运算符?:的简写形式. 比如一个optional String类型的变量 var a:String? // prin ...
- Image控件Stretch属性
通过设置Image控件Stretch属性的值可以控制图片的显示形式: 包含的值:None.Fill.Uniform.UniformToFill <Grid x:Name="Layout ...
- activity_main.xml 要用 Android Common XML Editor打开,双击的方式直接跳转到浏览器了
- Cocos2d-x之Schedule
Cocos2dx的定时器 from://http://blog.linguofeng.com/archive/2012/11/14/cocos2d-x-Schedule.html 一.schedule ...
- source insight设置tab键为4个空格
首先通过路径(Options->Document Options)进入以下界面: step 1:将 Visible tabs 打勾. step 2 :将 Expand Tabs 打勾. step ...
- Java类加载机制的理解
算上大学,尽管接触Java已经有4年时间并对基本的API算得上熟练应用,但是依旧觉得自己对于Java的特性依然是一知半解.要成为优秀的Java开发人员,需要深入了解Java平台的工作方式,其中类加载机 ...
- Android中的输入法
提起输入法我就想到了Edittext,输入法可以自动根据inputType来改变键盘的布局,在支付钱包中还特别隐藏的系统自带的输入法,直接让用户用软件自己的输入法,提高了安全性.所以,我们应该对输入法 ...
- Orchard 之:Widget,兼看 Layer 在权限控制中的作用
一:Widget 可以理解为控件,可以直接被页面所引用.行为类似与分部页面,比如,我们可以创建一个 商品列表 Widget,然后这个 Widget 就可以被很多页面所引用. 理解 Widget 这个概 ...
- sulime代理设置、插件管理
使用command palette或者package control,可以管理插件:安装.更新.启动.关闭插件.卸载插件等 配置Package Control 配置举例: { "bootst ...
- org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from String value '20Spring Jackson 反序列化Date时遇到的问题
Jackson对于date的反序列化只支持几种,如果不符合默认格式则会报一下错误 org.codehaus.jackson.map.JsonMappingException: Can not cons ...