[英]How can I terminate an ASP.NET application on IIS following an unrecoverable error?
Supopse我有一個未處理的異常(或一個已知的嚴重,不可恢復的錯誤)。 最可怕的情況是安全漏洞,但它可能適用於任何情況,這意味着我的狀態非常糟糕,以至於我無法期望繼續安全進行下去。
我該怎么辦?
在傳統應用程序中,通常的技術是快速結束我的過程。 盡快地。 我正在調用Process.Exit,TerminateProcess,die或任何其他環境具有“ END。NOW”功能的工具。 埃里克·利珀特(Eric Lippert)的帖子很好地表達了這種態度的理由。
在IIS上運行的生產ASP.NET應用程序中,這不是那么簡單。 我當然可以結束當前過程,並在事件日志或任何地方發出錯誤提示。 本質上就是任何未處理的異常都會發生的情況。 但是,下次發出請求時,IIS只會啟動一個新的工作進程。 如果我的致命錯誤是暫時性問題,那就太好了。
但是,如果我的問題在我的整個過程中仍然存在,那么新的問題將再好不過了。 甚至可以通過初始化代碼或重新嘗試使其變得更加復雜。 另外,如果IIS在同一個應用程序池中運行多個工作進程,那么即使殺死我的進程也不會殺死該應用程序。 從邏輯上講,所有其他工人也可能被抽水,只是還不知道。
到目前為止,我只想出兩種選擇。
我能想到的是:
您可以繼續使用IIS中名為“快速失敗保護”的應用程序池的高級設置,根據需要將失敗間隔設置足夠長的時間,並將“ 最大失敗次數”設置為1,然后繼續引發異常並讓IIS認為此應用程序池無法正常工作,因此它將向客戶端發送回Service Unavailable服務 ,甚至重置連接(取決於您的設置)。 有關更多詳細信息,請在此處進行檢查: 應用程序池的故障設置 。 但是,您需要非常小心,不要過度使用,我的意思是您需要編寫一個非常好的應用程序,所有異常均已正確處理,IIS只能真正檢測到您想要終止應用程序的異常,否則可能只有一個用戶單擊即可降低您的網站。
另一個解決方案是繼續將其編寫為您自己的代碼,我的意思是您可以通過某種方式記錄這種錯誤,例如創建一個名為SystemCrashed的文件,然后終止該應用程序,然后檢查文件是否存在於Application_Startup上 ,除了終止如果找到文件,則應用程序。 像鎖一樣的東西。 這需要更多的代碼,但可能比IIS設置更安全,我的意思是,只要您正確地刪除了鎖,就不會有太多的殺傷力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.