Как поймать HttpRequestValidationException в производстве - PullRequest
20 голосов
/ 17 февраля 2011

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

Ответы [ 2 ]

14 голосов
/ 17 февраля 2011

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

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;
    }
}
6 голосов
/ 04 августа 2015

Другим способом, который работает только с 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;
        }
    }
}
...