先附代碼
///在當前專案開發中遇到了一個問題, 在調用GetResponse方法時, wReq會掛掉, 而且無法命中中斷點。
然後經過了大量努力和查閱資料仍沒有解決。 /(ㄒoㄒ)/~~
之前Get請求超時是因為被多執行緒情況下連接數限制了
改成這樣就行了System.Net.ServicePointManager.DefaultConnectionLimit = 512;
然而這對於現在這個問題沒有任何幫助, 在執行到System.Net.WebResponse wResp = wReq.GetResponse;時代碼直接會掛掉, 無法獲取異常, 也就無法分析是什麼問題導致的。
然後嘗試了大量的方法解決, 換成Post請求一樣失效;對HttpWebRequest 進行了大量設置, 一樣不管用;並且介面是正確的, 在流覽器中回應時間很快。
然而。 。 。 。 峰迴路轉, 在機緣巧合下我試了一下另起一個執行緒執行這個Get請求, 竟然正常了!現在就要反過來推理是怎麼回事了。
研究後發現這個Get請求是在windows消息執行緒中進行的, (public const int WM_COPYDATA = 0x004A; //當一個應用程式傳遞資料給另一個應用程式時發送此消息)
分析HttpWebRequest類:
HttpWebRequest請求是非同步回檔方式的, 從BeginGetResponse開始, 並通過AsyncCallback指定回檔方法;WebClient方式使用基於事件的非同步程式設計模型,在HTTP回應返回時引發的WebClient回檔是在UI執行緒中調用的, 因此可用于更新UI元素的性。 HttpWebRequest是基於後臺進程運行的, 回檔不是UI執行緒, 所以不能直接對UI進行操作, 通常使用Dispatcher.BeginInvoke跟介面進行通訊。
感覺失敗可能是跟其GetResponse內部實現相關。
希望大家引以為戒吧。 。 。 然後給大家遇到相同問題時如何思考提供一點淺顯的幫助