使用 HttpWebRequest 模擬並發請求的時候,發現不管怎么提高thread 的數量,都沒用,服務器端用計數器看到的都是2個連接,見下圖(關於計數器怎么開,百度)
然后搜了一下,發現需要在app.config 中配置如下
<system.net>
<connectionManagement>
<add address="*" maxconnection="1000000"/>
</connectionManagement>
</system.net>
或者在程序開始並發調用之前加入 System.Net.ServicePointManager.DefaultConnectionLimit = 1000;(這個數值是最大並發數)
經過我測試,這兩個方法都可以讓並發數如期並發,實驗方式是先寫了一個控制台程序A。在里面並發出100個線程,看我站點A的IIS連接數,不加這句代碼怎么樣都是2(我懷疑控制台程序被識別成一個瀏覽器客戶端,只能是2而不能是10),加了代碼,則是我並發數的連接數。
問題是解決了,但是我卻有一個新的疑問了,既然這樣子,那是否意味着,假設我有一個 web 項目的某個頁面A,正在使用 httpwebrequest 去訪問別人的接口,我假設接口地址是 api.baidu.com,如果有50個人同時訪問了我的頁面A,而我web.config中沒有按上面配置,豈不是我的頁面A只能同步處理2個人的請求了嗎?
然后我馬上去實踐,搭建了一個環境,隨意搞了一個頁面A,在頁面A中用httpwebrequest去訪問我臨時搭建的站點B(相當於上文提到的 api.baidu.com),我發現站點A上的連接數能上去,而站點B的連接數一直是10。
這代表頁面A上的並發請求被限制在了10(據說windows server系統限制是10,普通win7 xp限制是2。我站點A是建立在windows server2008上的)
然后,按上文提到的改config或者加代碼,就能提高並發數,所以,我先在頁面A的page_load中加入了 System.Net.ServicePointManager.DefaultConnectionLimit = 1000; 重新訪問一次頁面A(相當於讓站點A先編譯被IIS加載),然后開始用控制台並發了100個請求,發現站點B的計數器上,一直都是10,沒有變化。。。。。所以,搞不懂這問題在哪里,然我又嘗試去掉了這代碼,在web.config中加入了 上文提到的配置節點,再並發100個,這次站點A的計數器和站點B的計數器都上升到了100。,第一個圖是同步上升,站點A的web.config配置了上文說的代碼
下面一個圖是站點A的web.config取消了配置上面提到的代碼的計數器
實驗結果是出來了,我得出的結論是,如果我站點某個頁面有模擬請求其他接口的地方,必須要在我站點的web.config里面配置如上代碼(甚至連在page_load中加 System.Net.ServicePointManager.DefaultConnectionLimit = 1000;)這句話都沒用,這到底是為什么?這句代碼我在控制台里面測試絕對是可以用的,所以有知道的人請在評論區告訴我,不甚感激。