2017-06-02 91 views
0

我正在構建一個基於REST的Web服務,它將服務於幾百個客戶端,它們將全天上傳/請求一小撮信息,並且每天進行一次更大的緩存更新(大約100-200kb)。來自Web服務器的異常高速腐敗JSON響應,原因和解決方案?

在測試生產計算機上的大型更新(運行Apache/PHP的雲中的Linux虛擬機)時,我發現我非常沮喪地發現數據到客戶端損壞(即有一個或多個錯誤字符)時代。損壞的JSON的

例,解析器說SyntaxError: JSON.parse: expected ':' after property name in object at line 1 column 81998 of the JSON data

"nascita":"1940-12-17","attiva":true,","cognome":"MILANI" 

應該

"nascita":"1940-12-17","attiva":"true","cognome":"MILANI" 

這就是答案

Connection Keep-Alive 
Content-Type application/json 
Date Fri, 02 Jun 2017 16:59:39 GMT 
Keep-Alive timeout=5, max=100 
Server Apache/2.4.18 (Ubuntu) 
Transfer-Encoding chunked 

的HTTP標頭我當然不是專家當涉及到網絡,但我曾經認爲這樣的事件,失敗的IP和TCP錯誤檢測都非常少見。 (我發現這個帖子很有意思: Can a TCP checksum produce a false positive? If yes, how is this dealt with?

那麼......這裏怎麼回事?我錯過了什麼嗎?

我開始想到可能的解決方案。

我能想到的最快的就是使用HTTP壓縮:如果客戶端無法解壓內容(這很可能在數據損壞的情況下),那麼我可以再次請求內容。 我在Apache上啓用了此功能,但令我意外的是,所有響應均使用有效數據完成。 難道網絡瀏覽器(我使用的是舊的Firefox測試Web服務)有一些內置機制來重新請求損壞的壓縮數據嗎?或者,MAYBE壓縮數據的規模較小,性能較差會使TCP/IP出錯的可能性降低?

我想到的另一個快速解決方案是計算內容的校驗和,我可以對較小的請求執行某些操作,這些請求不會從壓縮中受益。 我想弄清楚是否以及如何在HTTP中的Content-MD5字段可以幫助我...網頁瀏覽器似乎忽略它,所以我想我將不得不計算和明確地比較它在我的客戶端...

使用TLS可能是另一個好主意,可能是最好的。

還是......我錯過了什麼東西巨大? 像,我不知道,出於某種原因,我的Apache使用UDP?

+0

你能提供它如何被破壞的例子嗎? – Fletchius

+0

你在上傳什麼,如何?你如何試圖解碼上傳?是什麼讓你說數據損壞? –

+0

它是JSON數據,firefox試圖解析它並告訴我哪些列包含錯誤 –

回答

2

所有這些錯誤都沒有任何意義。

因此,我讓Wireshark捕獲從Web服務器傳入的所有TCP段,並查看它們可能存在的問題。再次,Firefox在一個隨機列中顯示了一個錯誤,但是......原來,在相應的TCP段中有沒有這樣的錯誤!

然後我嘗試了Chrome瀏覽器(它沒有內置解析器),安裝了JSONView擴展和一切都很好!與Firefox一樣,安裝了JSONView,並沒有錯誤!

原來有某種錯誤與最新的Firefox內置JSON觀衆。我現在正在運行53.0.3。

+0

我在這上面追逐了幾個小時。謝謝! – Tim