如何在生产中捕获HttpRequestValidationException

时间:2011-02-17 11:16:07

标签: c# asp.net asp.net-3.5 iis-7.5 global-asax

我有这段代码来处理我的global.asax.cs文件中的HttpRequestValidationException。

protected void Application_Error(object sender, EventArgs e)
{
    var context = HttpContext.Current;
    var exception = context.Server.GetLastError();
    if (exception is HttpRequestValidationException)
    {
        Response.Clear();
        Response.StatusCode = 200;
        Response.Write(@"<html><head></head><body>hello</body></html>");
        Response.End();
        return;
    }
}

如果我调试我的webapplication,它的工作原理很完美。但是,当我把它放在我们的生产服务器上时,服务器会忽略它并生成“从客户端检测到一个潜在危险的request.form值” - 错误页面。 我不知道到底发生了什么...... 如果有人知道问题是什么,或者我做错了什么..?

另外,我不想在web.config中将validaterequest设置为false。

服务器使用IIS7.5,我使用的是asp.net 3.5。

谢谢, 布鲁诺

2 个答案:

答案 0 :(得分:14)

好的,我发现这是我的自我。 我必须清除我的上一次错误。

protected void Application_Error(object sender, EventArgs e)
{
    var context = HttpContext.Current;
    var exception = context.Server.GetLastError();
    if (exception is HttpRequestValidationException)
    {
        context.Server.ClearError();    // Here is the new line.
        Response.Clear();
        Response.StatusCode = 200;
        Response.Write(@"<html><head></head><body>hello</body></html>");
        Response.End();
        return;
    }
}

答案 1 :(得分:6)

另一种仅适用于MVC的方法是使用自定义异常过滤器:

  • 创建实现IExceptionFilter
  • 的自定义FilterAttribute
  • 从FilterAttribute内部,您可以重定向到控制器或视图以用于显示错误。
  • 在Global.asax中注册过滤器或将您的控制器属性注册

这样做的好处是可以使用普通的MVC基础结构(Razor)来呈现错误视图。

public class HttpRequestValidationExceptionAttribute : FilterAttribute, IExceptionFilter {

    public void OnException(ExceptionContext filterContext) {
        if (!filterContext.ExceptionHandled && filterContext.Exception is HttpRequestValidationException) {
            filterContext.Result = new RedirectResult("~/HttpError/HttpRequestValidationError");
            filterContext.ExceptionHandled = true;
        }
    }
}