1 webrequest 是什麼:程式設計方式模拟web請求,利用webrequest可以實作 相當于一個浏覽器請求一個網頁的效果,但是它始終是模拟請求,
與浏覽器輸入框輸入網址請求不一樣。
2 程式設計中有時有這樣的case,需要請求一個url,獲得特定網頁的部分html代碼,比如特定的table,div片段。
這個時候可以用代碼實作一個httpwebrequest請求,以get的方式請求遠端站點的一個url,傳回結果是網頁的整個html,之後再在結果中提取我們需要的資料。
代碼如下
在遠端站點伺服器不做任何限制的情況下,這樣的單個請求一般都會成功。
有幾種情況需要注意。
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檔案,根據業務關系擷取相應的資訊,将需要的資料存放到資料庫中