2009-02-02 18 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无法处理的某些输入。