2012-11-08 48 views
2

我有一個具有單頁方法的web窗體。我的其他Web應用程序將未處理的異常記錄到Web服務器上的系統事件日誌中。由於我與其他開發人員一起工作期望在事件日誌中看到應用程序錯誤的條目,因此我希望此應用程序也能這樣做。有頁方法未處理的異常表現爲其他ASP.Net未處理的異常

但是,我有應用程序發送錯誤電子郵件時,從頁面方法內調用代碼捕獲異常。發生這種情況時,不會寫入事件日誌。注意:頁面方法在調用我的電子郵件通知方法後重新拋出異常。

從我迄今爲止閱讀的內容看來,ASP.Net默認將錯誤記錄到事件日誌中。我想,對於Page Methods/WebMethods來說,情況並非如此,因爲它們基本上將異常拋出到調用它的客戶端代碼。

是否有一個微不足道的方法讓異常冒泡得當,以便它寫入事件日誌?沒有其他應用程序直接從我看到的事件日誌中寫入事件日誌,所以我不認爲應用程序可以創建新的源,因爲我們的安全人員保留了很多東西(有良好的意圖,耶安全)。

[WebMethod] 
public static object MyPseudoWebMethod() 
{ 
    try 
    { 
     // My exception spawning unreliable code here 
    } 
    catch(Exception ex) 
    { 
     // Cleanup ... 
     this.SendErrorNotification(ex); 

     throw; // <-- This doesn't bubble up but I'd love for it to! 
    } 
} 
+0

您確定沒有像其他異常一樣處理嗎?我會假設你的應用程序會像其他任何處理那樣的錯誤,唯一的區別是客戶端頁面沒有明顯的變化。但在AJAX調用的後面,webmethod會拋出一個異常,這會使AJAX響應成爲YellowScreenOfDeath或您擁有的任何自定義錯誤頁面,並且所有後續代碼都將通過這樣的自定義錯誤頁面執行。 – Graham

+0

錯誤日誌不包含例外情況,但它具有其他應用程序的例外情況。儘管AJAX電話不會呈現黃色屏幕。頁面已經加載,客戶端JavaScript調用webmethod,webmethod引發異常,客戶端javascript檢測到錯誤,但事件日誌中沒有記錄異常。 – jlafay

+0

您有「具有單個WebMethod的網絡表單」嗎? –

回答

0

這就是傳統ASMX Web服務的工作原理。

唯一的解決方法是停止使用它們(無論如何,你應該這樣做,除非你被困在.NET 2.0中)。 WCF沒有這個問題。

+0

這是我最近在做的一箇舊應用程序。一般來說,我會更喜歡WCF這種行爲,但我認爲對於這種情況它可能是好的。主要是因爲它是一種方法,它仍然在工作,對於這樣一個簡單的應用程序,WCF配置地獄並不是必需的。 – jlafay

+0

自.NET 4.0起,WCF配置地獄不再存在,BTW。 –

+0

我認爲這是一個意見問題:)我知道它不是同一個動物,因爲它僅限於用於協議選擇的HTTP,但是我對Web API的配置和易用性感到高興。 – jlafay

1

嗯有趣的問題。 WebMethod異常不會遵循正常的異常流程,這是正確的。

如果您的web方法拋出 異常,則不會觸發Application_Error事件。這樣做的原因是,XML網絡服務 HTTP處理消耗了,而XML Web服務 正在執行發生,並將其轉化之前 Application_Error事件被稱爲SOAP錯誤的任何異常。

(從here

以上頁建議使用SOAP擴展捕獲了異常的吞噬之前,但在這裏就是我會做,如果你不想這樣做:

1)新建一個「錯誤recieving」 ASPX頁面,你將構建一個將要在錯誤日誌中記錄任何PARAMS。因此,例如,讓這個頁面接受一個名爲「ExceptionDetails」的POST或其他你想要捕獲的東西。這個頁面不會直接在瀏覽器中查看,所以它不需要任何ASPX控件或任何東西,但使用它的MasterPage不會損害任何東西。

2)在這個新頁面的代碼後面,抓住你正在發送的任何帖子,並用你需要的任何細節新建一個Exception。立即拋出這個異常。這樣做意味着這個異常將遵循應用程序中其他未處理異常(日誌記錄,電子郵件等)的流程。

3)在調用的WebMethod JS的頁面,裹在一個try-catch

4)在catch塊中的通話將WebMethod,打印出你想要的任何消息,在瀏覽器中,並啓動新的AJAX發佈到新的錯誤接收ASPX頁面,傳遞任何你發佈的頁面尋找的東西。

新的AJAX調用不會改變默認情況下在用戶的感知任何東西。 AJAX調用觸發對該頁面的新請求,並且ASPX頁面實際上完全不知道其AJAX而不是正常的瀏覽器請求。如果您正在記錄用戶的ID或任何內容,則當前設置的任何Cookie /會話/認證數據也可用於AJAXed頁面。如果你看看Firebug這樣的工具返回的響應,你會看到它實際上是YellowScreenOfDeath的HTML(除非你有一個自定義的500頁,在這種情況下,它的HTML會返回)。