您的位置:首頁>正文

C中調用HttpWebRequest類中Get/Post請求無故失效的詭異問題

先附代碼

/// /// 用戶端Http(GET) /// /// 請求路徑 /// response字串 public string HttpGet(string strUrl) { // string strEncodeUrl = HttpUtility.UrlEncode(strUrl, Encoding.UTF8); string content = string.Empty; try { HttpWebRequest wReq = (HttpWebRequest)WebRequest.Create(strUrl); wReq.Method = "GET"; // Get the response instance. System.Net.WebResponse wResp = wReq.GetResponse; System.IO.Stream respStream = wResp.GetResponseStream; using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream, UTF8Encoding.UTF8)) { content = reader.ReadToEnd; } respStream.Close; wResp.Close; wReq.Abort; } catch (Exception ex) { LogHelper.Instance.Error("HttpGet請求出錯:" + ex.ToString); throw; } return content; }

在當前專案開發中遇到了一個問題, 在調用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內部實現相關。

希望大家引以為戒吧。 。 。 然後給大家遇到相同問題時如何思考提供一點淺顯的幫助

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示