2009-02-02 56 views
4

我試圖重寫Web窗體的onError事件處理程序,以允許「從客戶端檢測到潛在危險的Request.Form值」類型錯誤要在窗體內處理而不是結束在應用程序級錯誤處理程序。處理請求驗證'默默'

我發現一些示例代碼是這樣的:

protected override void OnError(EventArgs e) 
{ 
    // At this point we have information about the error 
    HttpContext ctx = HttpContext.Current; 

    Exception exception = ctx.Server.GetLastError(); 

    string errorInfo = 
     "<br>Offending URL: " + ctx.Request.Url.ToString() + 
     "<br>Source: " + exception.Source + 
     "<br>Message: " + exception.Message + 
     "<br>Stack trace: " + exception.StackTrace; 

    ctx.Response.Write(errorInfo); 

    // -------------------------------------------------- 
    // To let the page finish running we clear the error 
    // -------------------------------------------------- 
    ctx.Server.ClearError(); 

    base.OnError(e); 

} 

令人滿意地捕獲錯誤並進行寫入一條錯誤消息的屏幕,但我真正想要做的是要意識到錯誤時的Page_Load火災所以能夠在webform上顯示'正常'錯誤消息。

我敢肯定有一個很好的方法來做到這一點,但我不知道它!建議?

(BTW各種原因,我不希望檢查在任一形式或應用程序級別關閉,我也不希望依賴於JavaScript - 感謝)

回答

4

您實際上可以在頁面級別捕獲錯誤,但它會終止頁面生命週期。所以你必須使用一個技巧來解決它。例如:

public override void ProcessRequest(HttpContext context) 
{ 
    try 
    { 
    base.ProcessRequest(context); 
    } 
    catch(HttpRequestValidationException ex) 
    { 
     context.Response.Redirect("HandleValidationError.aspx"); 
    } 
} 

HandleValidationError.aspx可以是任何東西,包括一個重定向回到同一頁面(可能與信息查詢字符串關於錯誤,例如「ContactForm.aspx錯誤=無效+請求?」)

0

我不認爲你會能夠處理Page_load事件中的錯誤。在ASP.NET Page Life cycle驗證事件發生在頁面加載後。

也許您可以添加隱藏的div(< asp:Panel Visible = false ...),其中包含您的「正常錯誤消息」。如果OnError事件觸發,則顯示錯誤消息div。

傑森

1

我想我明白你想要做什麼,但我恐怕這可能是不可能的。當您的ASP.NET頁面執行回發時,將在服務器上創建一個新線程來處理請求。在您的頁面生命週期甚至有機會開始之前,會發現有問題的XSS並引發異常。一旦拋出這個異常,你就被從ASP.NET頁面生命週期中「驅逐出來」,並且沒有辦法重新輸入它。此時,您可以在客戶端執行的唯一操作是輸出錯誤,或重定向到錯誤頁面。

你似乎想要做的就是捕捉異常,將它寫在頁面的某處,並繼續ASP.NET頁面生命週期(即恢復控制樹,恢復視圖狀態,調用事件處理程序等)。問題是,一旦拋出未處理的異常,您將無法再訪問ASP.NET頁面生命週期。在這種特殊情況下,無法放置try/catch塊,因爲在調用自己的代碼之前,異常是從ASP.NET生命週期內部拋出的。

我知道你說你不想依靠Javascript,但在這種情況下,我認爲使用Javascript是獲得你想要的行爲的唯一方法。您仍然可以保留服務器端驗證,以防萬一您的用戶禁用Javascript或鍵入您的Javascript無法處理的某些輸入。