Проверка запроса на обработку "без вывода сообщений" - PullRequest
4 голосов
/ 02 февраля 2009

Я пытаюсь переопределить обработчик события onError веб-формы, чтобы позволить ошибкам типа «потенциально опасное значение Request.Form, обнаруженное на клиенте» обрабатываться в форме, а не заканчиваться ошибкой уровня приложения. обработчик.

Я нашел такой пример кода:

   protected override void OnError(EventArgs e)
{
    // At this point we have information about the error
    HttpContext ctx = HttpContext.Current;

    Exception exception = ctx.Server.GetLastError();

    string errorInfo =
       "<br>Offending URL: " + ctx.Request.Url.ToString() +
       "<br>Source: " + exception.Source +
       "<br>Message: " + exception.Message +
       "<br>Stack trace: " + exception.StackTrace;

    ctx.Response.Write(errorInfo);

    // --------------------------------------------------
    // To let the page finish running we clear the error
    // --------------------------------------------------
    ctx.Server.ClearError();

    base.OnError(e);

}

, который удовлетворительно улавливает ошибку и выводит сообщение об ошибке на экран, но я действительно хочу знать об ошибке при запуске Page_Load и иметь возможность отображать «нормальное» сообщение об ошибке в веб-форме.

Я уверен, что есть хороший способ сделать это, но я этого не знаю! Предложения?

(Кстати, по разным причинам я не хочу отключать проверку на уровне формы или приложения и не хочу полагаться на Javascript - спасибо)

Ответы [ 3 ]

4 голосов
/ 02 февраля 2009

На самом деле вы можете поймать ошибку на уровне страницы, но это убьет жизненный цикл страницы. Таким образом, вы должны использовать трюк, чтобы обойти это. Пример:

public override void ProcessRequest(HttpContext context)
{
  try
  {
    base.ProcessRequest(context);
  }
  catch(HttpRequestValidationException ex)
  {
      context.Response.Redirect("HandleValidationError.aspx");
  }
}

HandleValidationError.aspx может быть любым, включая перенаправление на ту же страницу (возможно, со строкой запроса с информацией об ошибке, например, «ContactForm.aspx? Error = Invalid + Request»)

1 голос
/ 02 февраля 2009

Мне кажется, я понимаю, что вы хотите сделать, но я боюсь, что это может быть невозможно. Когда ваша страница ASP.NET выполняет обратную передачу, на сервере создается новый поток для обработки запроса. Еще до того, как жизненный цикл вашей страницы успевает начаться, обнаруживается нарушающий XSS и выдается исключение. После создания этого исключения вы «изгоняетесь» из жизненного цикла страницы ASP.NET, и вы не можете повторно войти в него. На данный момент единственное, что вы можете сделать на стороне клиента, это вывести ошибку или перенаправить на страницу ошибки.

То, что вы хотите сделать, это перехватить исключение, записать его где-нибудь на странице и продолжить жизненный цикл страницы ASP.NET (т. Е. Восстановить дерево элементов управления, восстановить представление состояния, вызвать обработчики событий и т. Д.). Проблема заключается в том, что после возникновения необработанного исключения у вас больше нет доступа к жизненному циклу страницы ASP.NET. В этом конкретном случае некуда поставить блок try / catch, потому что внутреннее исключение выдается из жизненного цикла ASP.NET до вызова вашего собственного кода.

Я знаю, что вы сказали, что не хотите полагаться на Javascript, но в этом случае я думаю, что использование Javascript - единственный способ получить желаемое поведение. Вы все еще можете сохранить проверку на стороне сервера, на случай, если ваши пользователи отключат Javascript или введут какой-то ввод, который не обрабатывается вашим Javascript.

0 голосов
/ 02 февраля 2009

Не думаю, что вы сможете обработать ошибку в событии Page_load. В жизненном цикле страницы ASP.NET события проверки происходят после загрузки страницы.

Возможно, вы можете добавить скрытый div (

1007 * Ясон *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...