這幾天給系統作第三方集成, 須要調用另外一個軟件的一個接口, 經過 HTTP 的方式調用,調用代碼也挺簡單的:json
string serviceUrl = string.Format("{0}/{1}", this.BaseUrl, path); HttpWebRequest request = null; Stream reqStream = null; request = (System.Net.HttpWebRequest)WebRequest.Create(serviceUrl); request.Method = "POST"; request.Accept = "*/*"; request.ContentType = "application/json;charset=UTF-8"; byte[] postData = Encoding.UTF8.GetBytes(param); reqStream = request.GetRequestStream(); reqStream.Write(postData, 0, postData.Length); using (var response = (HttpWebResponse)request.GetResponse()) { Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("UTF-8")); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); return retString; }
代碼也沒有什麼特別的,可是當代碼執行到 request.GetResponse() 時,程序是不報錯, 也不往下執行了,就一直卡在這裏,服務器端也沒有接收到請求(服務端是沒有問題的),找了一上午,各類屬性都設置了一遍,都沒有效果,最後忽然想到好像少了給 request 設置一個 ContentLength 屬性, 立刻加上 request.ContentLength = postData.Length, 再測試就行了。服務器
這個問題找這麼久, 是由於剛開始在我本地作測試的時候是沒有問題, 一切都正常, 部署到服務器上後發現調用不通, 因此剛開始覺得是服務器這邊有什麼端口限制什麼的,因此一直在叫服務器管理人員查網絡設置,後來爲了測試方便,在本地建立了一個 WINFORM 程序來測試,發如今 WINFORM 程序裏測試的時候也不行了,再運行以前的寫的測試程序,又能夠, 比較了一下兩個 .NET 版本,以前使用的是 .NET FRAMEWORK 4.7, WINFORM 使用的是 .NET FRAMEWORK 3.5。網絡
在 .net framework 4.7 應該對這個屬性作了處理, 可是在 3.5 裏, 沒有這個屬性, 就沒有任何反應,這個也太坑了點, 拋出一個異常也好啊!app