首頁

2013年7月11日 星期四

**等待數分鐘仍出現*瀏覽器出現無法顯示網頁**?!)))

**等待數分鐘仍出現*瀏覽器出現無法顯示網頁**?!)

****>按完-->某個按鈕後超過五分鐘才會有回應的網頁))

***( 註: 屬錯誤示範*)改善方式請參考 ( 耗時Stored Procedure的ASP.NET Postback ---
---進度回報寫法 ),在測試台測試OK,移到正式台後,按鈕後五分鐘就會---
----出現無法顯示網頁錯誤?!))

***(

((
  • 使用IE、Chrome、Firefox測試,IE與Firefox都是超過5分鐘---
  • -----就發生無法顯示網頁錯誤,Chrome卻可正常運作。
  • 若由正式台伺服器同一網段的IE測試,則無逾時錯誤問題 )**
  • ***Microsoft Network Monitor---側錄一段IE連正式台重現錯誤的--
    ---封包往來,很快找到原因:                                                           **
    ***



    ***可看到300秒後Server端抛回一個TCP封包,
    紅框中的R為TCP RST Flag,表示伺服器端要求中止連線**) /
    ***在IE接到此封包的時間,則好就是彈出無法顯示網頁的時機,
    一秒不差*)>

    ***把同樣實驗搬回本機VM,等待時間即使拉長到7分鐘,
    也不會有連線中斷狀況*   
    ))資訊最後一點,從正式機同網段以IE測試不會出現逾時。
    推測問題出在Client與正式台間的網路設備,而該負載平衡設備
    曾有強切Oracle Session的前科  >/    ***
    ***
    ASP.NET網站伺服器遷移後,查詢Oracle資料庫時偶爾會--
    --出現"ORA-12571: TNS:封包寫入器失敗(TNS:packet writer failure)",
    但重新整理網頁後則又正常。
    Oracle.DataAccess.Client.OracleException.HandleErrorHelper
    (Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlVarCtx* pOpoSqlVarCtx, Object src, String procedure) at Oracle.DataAccess.Client.OracleCommand.ExecuteReader
    (Boolean requrey, Boolean fillRequest, CommandBehavior behavior)
    at Oracle.DataAccess.Client.OracleCommand.

    經爬文發現此錯誤多屬網路傳輸層次問題,多因網路品質、
    傳輸設備、防火牆... 等因素導致與Oracle伺服器網路連線---
    ---發生中斷引起。而新近ASP.NET伺服器環境的主要變動是--
    --納入負載平衡設備(Load Balancer, NLB)管轄, 
    因此與Oracle資料庫的連線預設也會經過NLB設備,
    有可能是造成問題的原因。
    試著將伺服器移出NLB,問題就消失了;配合網管人員由NLB觀察,
    確認NLB的Session管理機制會導致Oracle連線Session中斷 
    (但SQL Server的連線則不會)。
    將Oracle連線排除在NLB管理範圍外,問題排除     ~!*))    
    ***(((最後的疑問,為什麼Chrome不會出錯 ? 就用Firefox、IE、
    Chrome的封包分析來說明吧  !)  
    **Firefox*
    **
    **IE**
    **
    **Chrome**

    ))***由往來封包可知,IE及Firefox在送出HTTP Request後,
    只會靜待HTTP Response回傳資料,而Chrome不同,
    在等待期間每隔45秒就會丟出一個TCP Keep Alive封包   *)
    ***依我推測,每45秒一次的TCP Keep Alive活動讓網路設備--
    ---認定該連線仍在活動中,免除被強制斷線的命運   *))>

    ***~而修改測試ASP.NET網頁,每一分鐘以Response.Flush()方式_----
    ------抛回一個字元,IE/Firefox便不會在五分鐘時出錯   ))>/

    **至此,謎團都解開~!!**

    **這個案例的建議是: 修改ASP.NET程式****
    ***加入耗時Stored Procedure的ASP.NET Postback進度回報寫法 ***
    ***如此等待過程使用者能持續收到進度回饋改善使用體驗***>
    ****))也不會讓網路設備看不下去誤判閒置而強切連線,是較佳的解法****))

    )>
    &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&