Как поймать HttpRequestValidationException в производстве
У меня есть эта часть кода для обработки 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.
Спасибо,
Бруно
Ответы
Ответ 1
Хорошо, я нашел это сам.
Я должен удалить последнюю ошибку.
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
Другим способом, который работает только с 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;
}
}
}