.NET程序下載獲得的ContentLength=-1
阿新 • • 發佈:2018-10-08
class protoc ssl 文件讀取 toc 數據 瀏覽器 簡單 cat
你寫的.NET(C#)下載程序是否會遇到過這樣的問題?--ContentLength=-1.
例如,有如下代碼:
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse webResponse = null; webRequest.Timeout = 100000; webResponse = (HttpWebResponse)webRequest.GetResponse(); Stream resStream = webResponse.GetResponseStream(); StreamReader xtReader= new StreamReader(resStream); int DataSize = webResponse.ContentLength;//ContentLength 等於-1
會發現ContentLength=-1,這是為什麽呢?!
用http分析工具會發現,原因原來是很簡單的,這是因為某些網站服務器在發送響應內容時,會用gzip或 deflate等壓縮算法壓縮網頁的內容,這樣能使網頁內容的數據包體積大大減小,從而加快了網絡傳輸,這樣客戶端的瀏覽器顯示網頁也加快了。就是因為這 個gzip或 deflate功能,使得網頁數據在進行http傳輸時不會在header裏加上ContentLength屬性,所以程序取回 來的ContentLength 的數值就默認為-1了(而 沒有gzip或 deflate功能的網頁肯定會ContentLength具體數值)
改進:
byte[] arraryByte = new byte[1024]; try { HttpWebRequest req = (HttpWebRequest)WebRequest.Create(filePath); req.Method = "Get"; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Ssl3; ServicePointManager.ServerCertificateValidationCallback+= (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) => true; using (HttpWebResponse wr = (HttpWebResponse)req.GetResponse()) { Stream stream = wr.GetResponseStream(); //讀取到內存 MemoryStream stmMemory = new MemoryStream(); byte[] buffer1 = new byte[1024 * 100]; //每次從文件讀取1024個字節。 int i; //將字節逐個放入到Byte 中 while ((i = stream.Read(buffer1, 0, buffer1.Length)) > 0) { stmMemory.Write(buffer1, 0, i); } arraryByte = stmMemory.ToArray(); stmMemory.Close(); stream.Close(); } }
.NET程序下載獲得的ContentLength=-1