2013-02-07 14 views
1

我有一個使用自定義錯誤的ASP.NET應用程序。有一個錯誤發生,我似乎無法獲得有關信息。發生錯誤時,它會觸發自定義錯誤頁面,但由於某種原因,它不會觸發Page_Error或Application_Error。如果我完全關閉CustomErrors,則完全沒有任何反饋。我迄今爲止唯一得到的反饋是重定向到自定義錯誤頁面。如何捕獲觸發自定義錯誤頁面的ASP.NET錯誤,但不是Application_Error

場景:ASP.NET WebForms應用程序。其中一個頁面有一個帶有提交按鈕的UpdatePanel。該頁面正常工作。但是如果我走開一段時間(似乎是30-60分鐘),然後回來點擊提交按鈕,什麼都不會發生;沒有錯誤,頁面沒有響應 - 什麼都沒有。在調試器中運行時,我一直無法實現這一點;它只發生在IIS(7.5)中時。 [我見過有關此問題的其他SO帖子,但沒有任何建議適用於我。]

發生錯誤時,使用CustomErrors = On或RemoteOnly,重定向到自定義錯誤頁面,並且使用RemoteOnly,從服務器,我根本沒有得到任何反饋,類似於與customerrors = off的遠程連接。我真的很希望YSOD錯誤頁面。

我試圖通過將錯誤記錄到數據庫來捕獲Page_Error中的錯誤,但那也不起作用。我知道Page_Error和DB部分正在工作,因爲如果我改變後面的提交代碼以除以零來分隔,錯誤就會記錄在數據庫中。此外,零差錯將顯示給客戶端,客戶=關閉,並在它上面將顯示自定義錯誤頁面。但是除去零除錯誤,然後等待30分鐘左右再次嘗試,即使它重定向到自定義錯誤頁面,Page_Error代碼也沒有被擊中。然後,我嘗試將Page_Error中的代碼移動到Application_Error,但同樣的事情發生。由錯誤強制劃分的作品,但這看似超時相關的錯誤並沒有。

那麼,是否有某些錯誤仍然可以觸發重定向到自定義錯誤頁面,但不會觸發Application_Error事件?

+1

我在AJAX更新中調用的代碼中有類似的錯誤。 Elmah能夠捕捉到這個例外。我相信它也可以使用ASP.NET Health Monitoring進行查看。最後,我實際上收到了AJAX錯誤和異常消息。 –

+1

如果錯誤在IIS到達ASP.NET執行管道之前由IIS處理,則無法在代碼中捕獲它。是否有可能IIS進程被回收或會話超時?在IIS中啓用失敗的請求跟蹤,可能會爲您提供有關失敗的更多信息。 – Sergey

回答

1

謝謝約翰和謝爾蓋!這真的是一堆蠕蟲。謝爾蓋,你完全正確 - 會議超時。約翰的想法讓我想到了Windows應用程序事件日誌,而不是試圖在代碼中追蹤它。事實證明,當會話超時時,我的ViewState即將過期,默認設置爲20分鐘。確切的事件日誌錯誤是:

「Viewstate verification failed。原因:視圖狀態提供失敗的完整性檢查。」

現在我能夠手動回收應用程序池並強制錯誤發生在我的閒暇時間,這使得解決問題變得更容易。儘管我沒有使用Session,但至少在頁面上沒有問題,那爲什麼這麼做呢?此鏈接有助於解決發生的問題。

http://support.microsoft.com/default.aspx?scid=kb;en-us;829743

深埋入文章是描述導致工作進程循環的情形下句:

「應用程序池下比在本地系統帳戶之外的身份,網絡運行服務帳戶或管理級帳戶。「

我的AppPool實際上是在我爲此創建的本地用戶帳戶下運行的。當我將AppPool更改爲使用ApplicationPoolIdentity運行時,在回收AppPool後,ViewState錯誤消失了。然後,我再次將AppPool設置爲使用本地用戶帳戶運行,爲該帳戶提供本地管理權限,並且這也修復了它。不想讓這個用戶成爲本地管理員,我最終選擇了一種不同的解決方案,即爲該應用程序生成一個機器密鑰,以便ViewState MAC始終保持不變,而不是使用默認的自動生成新的每次游泳池重新進行或會話超時。請注意,如果負載均衡器後面有多個Web服務器,則通常也需要執行此操作。

+0

儘管我解決了潛在的問題,但我並沒有真正回答我原來的問題,這就是爲什麼Application_Error沒有被觸發?我相信這是因爲當ViewState無效時,繼續運行服務器端代碼會帶來安全風險,因此IIS會跳過它,但仍然有重定向到自定義錯誤頁面的良好意義。所以是的,某些錯誤不會觸發正常的錯誤流程。 – TTT

相關問題