2009-02-02 4 views
4

Я пытаюсь переопределить обработчик событий 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 - спасибо)

ответ

4

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

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

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

0

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

Возможно, вы можете добавить скрытый div (< asp: Panel Visible = false ...), который содержит ваше «нормальное сообщение об ошибке». если в событии OnError появляется сообщение об ошибке div.

джейсон

1

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

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

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

Смежные вопросы