天天看點

我的webrequest經驗

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檔案,根據業務關系擷取相應的資訊,将需要的資料存放到資料庫中

繼續閱讀