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

17

У меня есть эта часть кода для обработки 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.

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

Теги:
asp.net-3.5
iis-7.5
global-asax

2 ответа

10
Лучший ответ

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

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
    Я не думаю, что вам нужен "контекст" вар. Он прекрасно работает как "Server.GetLastError ()" и "Server.ClearError ()".
  • 0
    Response.End () генерирует исключение по дизайну. Вместо этого используйте это: HttpContext.Current.ApplicationInstance.CompleteRequest . Посмотрите на это для объяснения: support.microsoft.com/en-us/help/312629/…
4

Другим способом, который работает только с 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;
        }
    }
}
  • 0
    Спасибо, что поделились :-) Я посмотрю на это, когда у меня будет свободное время :-)
  • 0
    Всегда приятно:>
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню