我的webrequest经验

简介: 1  webrequest 是什么:编程方式模拟web请求,利用webrequest可以实现 相当于一个浏览器请求一个网页的效果,但是它始终是模拟请求, 与浏览器输入框输入网址请求不一样。 2 程序设计中有时有这样的case,需要请求一个url,获得特定网页的部分html代码,比如特定的table,div片段。

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请求远程网页的做法不是一个科学可靠的设计方案,

这样做不稳定而且风险巨大,一定数量级的频繁请求肯定会出问题。程序需要的数据最好还是预先放在数据库中做持久化处理。

像我描述的这种case还有一种解决方法是:直接读取服务器上的html文件,根据业务关系获取相应的信息,将需要的数据存放到数据库中

目录
相关文章
|
监控 Java 网络性能优化
容器内存可观测性新视角:WorkingSet 与 PageCache 监控
本文介绍了 Kubernetes 中的容器工作内存(WorkingSet)概念,它用于表示容器内存的实时使用量,尤其是活跃内存。
57212 116
容器内存可观测性新视角:WorkingSet 与 PageCache 监控
|
缓存 Prometheus 监控
Metrics-Server指标获取链路分析
Metrics-server基于cAdvisor收集指标数据,获取、格式化后以metrics API的形式从apiserver对外暴露,核心作用是为kubectl top以及HPA等组件提供决策指标支持。
2504 6
|
5天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
15天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
9天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
590 212
|
4天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
234 138
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
828 60
|
7天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1217 157