分享asp.net 網站部署一段時候後無法響應經驗
站點的後臺服務端全部用的是自定義的httpHandler實現的,前端通過ajax呼叫。.net版本是4.0。釋出到正式環境(win server 2003,IIS 6.0)後,一切正常,但是過一段時間後所有自定義的httpHandler都無法訪問,提示404錯誤,靜態資源卻可以正常訪問。因為老闆近期要給客戶演示這個系統,需要緊急處理。
排查過程:
1、因為用了自定義httpModule來捕獲404錯誤,懷疑是這塊程式碼有問題。仔細看了下就拿幾行程式碼,沒有出錯的點,何況開始沒問題,一段時候出的問題。所以否決了該出錯點。
2、使用log4net元件捕獲相關httpHandler的關鍵程式碼,沒有捕獲到異常。
3、檢視系統事件,發現iis報 報錯了,報錯如下:
然後開始網上搜索該問題的相關解決方案,該問題的原因就是同一個應用程式池中的站點使用了不同的asp.net版本,導致iis崩潰。
我的站點用的是預設的應用程式池:defaultAppPool,asp.net版本是4.0,然後逐一排查其他使用defaultAppPool的站點.net版本,發現有兩個站點是2.0的。
此刻心裡終於有點底了,可能就是這個原因導致我的站點不能正常訪問。後續把.net 2.0改成了4.0的,又單獨新建了一個應用程式池供自己的站點使用。觀察下來目前沒有再出現請求httpHandler報404的錯誤了。
為了更徹底的定位問題,我應該依然使用defaultAppPool,而不是新建一個新的應用程式池。我後續會更新該篇文章為這個問題定個結論。
經過幾天的跟蹤,最後驗證了上述定論的正確性。另外,硬體資源充足的情況下建議為每個站點分配一個單獨的應用程式池,一旦該站點有問題手動回收應用程式池也不會影響到其他站點的正常執行。
如果想知道站點佔用伺服器記憶體情況,可以檢視站點所在應用程式池程序所佔cup和記憶體情況。怎麼辦呢?
1、工作管理員中->檢視->選擇列->勾選pid
2、執行->cmd命令->iisapp -a 這個命令執行後會彈出當前iis中所有應用程式池的pid程序號,根據pid就可以在工作管理員中檢視記憶體佔用情況了