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

20

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

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

    
задан bruno 17.02.2011 в 12:16
источник

2 ответа

12

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

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;
    }
}
    
ответ дан bruno 17.02.2011 в 16:22
  • Я не думаю, что вам нужен «контекст» var. Он отлично работает как «Server.GetLastError ()» и «Server.ClearError ()». –  WildJoe 12.12.2011 в 22:02
  • Response.End () генерирует исключение по дизайну. Вместо этого используйте это: HttpContext.Current.ApplicationInstance.CompleteRequest. Взгляните на это для объяснения: support.microsoft.com/en-us/help/312629/... –  Kamran 06.03.2018 в 15:16
5

Другим способом, который работает только с 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;
        }
    }
}
    
ответ дан Georg Patscheider 04.08.2015 в 14:03
  • Спасибо за обмен :-) Я посмотрю, когда у меня будет свободное время :-) –  bruno 05.08.2015 в 11:26
  • Всегда приятно:> –  Georg Patscheider 06.08.2015 в 13:55
  • Спасибо за это. Я использовал его, но обнаружил, что filterContext.ExceptionHandled уже установлен в true, поэтому код в операторе if не был запущен, и была показана страница ошибки по умолчанию. Я выбрал это условие, и теперь он работает отлично. Не уверен, что если это может вызвать проблемы в другом месте, хотя ... какие-то мысли? Благодаря! –  Kate 12.11.2015 в 12:16
  • Тестирование для ExceptionHandled выполняется таким образом, чтобы одно исключение не обрабатывалось несколькими фильтрами. См. stackoverflow.com/questions/10597478/... для дальнейшего обсуждения. –  Georg Patscheider 12.11.2015 в 15:44