我正在尝试覆盖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 - 谢谢)
答案 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。
杰森