处理请求验证'默默'

时间:2009-02-02 03:28:45

标签: asp.net validation events

我正在尝试覆盖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 - 谢谢)

3 个答案:

答案 0 :(得分:4)

您实际上可以在页面级别捕获错误,但它会终止页面生命周期。所以你必须用一个技巧来解决它。例如:

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

HandleValidationError.aspx可以是任何东西,包括重定向回同一页面(可能带有查询字符串,其中包含有关错误的信息,例如“ContactForm.aspx?error = Invalid + Request”)

答案 1 :(得分:1)

我想我明白你想做什么,但我担心这可能是不可能的。当您的ASP.NET页面执行回发时,将在服务器上创建一个新线程来处理请求。在您的页面生命周期甚至有机会开始之前,会发现有问题的XSS并引发异常。抛出此异常后,您将从ASP.NET页面生命周期中“逐出”,并且无法重新输入它。此时,您在客户端唯一可以做的就是输出错误,或者重定向到错误页面。

您似乎想要做的是捕获异常,将其写在页面的某个位置,然后继续ASP.NET页面生命周期(即恢复控制树,恢复视图状态,调用事件处理程序等)。问题是,一旦抛出未处理的异常,您就无法再访问ASP.NET页面生命周期。在这种特殊情况下,无处放置try / catch块,因为在调用自己的代码之前,ASP.NET生命周期内部会抛出异常。

我知道你说你不想依赖Javascript,但在这种情况下我认为使用Javascript是获得你想要的行为的唯一方法。您仍然可以保留服务器端验证,以防您的用户禁用Javascript或键入您的Javascript无法处理的某些输入。

答案 2 :(得分:0)

我认为您无法处理Page_load事件中的错误。在页面加载后发生ASP.NET Page Life cycle验证事件。

也许您可以添加包含“正常错误消息”的隐藏div(&lt; asp:Panel Visible = false ...)。如果OnError事件触发,则显示错误消息div。

杰森