Подтвердить что ты не робот

Как поймать HttpRequestValidationException в производстве

У меня есть эта часть кода для обработки HttpRequestValidationException в моем файле global.asax.cs.

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;
    }
}

Если я отлаживаю мое приложение, оно работает отлично. Но когда я помещаю его на наш производственный сервер, сервер игнорирует его и генерирует "потенциально опасное значение параметра request.form, обнаруженное на клиенте" - страницу с ошибкой. Я не знаю, что происходит точно... Если кто-нибудь знает, в чем проблема, или что я делаю неправильно.?

Также я не хочу устанавливать validaterequest в false в файле web.config.

Сервер использует IIS7.5, и я использую asp.net 3.5.

Спасибо, Бруно

4b9b3361

Ответ 1

Хорошо, я нашел это сам. Я должен удалить последнюю ошибку.

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;
    }
}

Ответ 2

Другим способом, который работает только с MVC, является использование настраиваемого фильтра исключений:

  • Создайте собственный атрибут FilterAttribute, который реализует IExceptionFilter
  • изнутри 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;
        }
    }
}