Перехват HttpRequestValidationException с помощью ExceptionHandler - PullRequest
0 голосов
/ 01 ноября 2018

Использование ASP.NET WebApi 2, Почему я не могу поймать HttpRequestValidationException в моем Global ExceptionHandler или Global ExceptionLogger?

Ошибка: [HttpRequestValidationException (0x80004005): потенциально опасное значение Request.QueryString было обнаружено с клиента ...]

Использование Application_Error работает нормально, исключение HttpRequestValidationException может быть замечено.

WebApiConfig.cs

public static void Register(HttpConfiguration config)
    {
        //...stuffs

        //Global exception handler
        config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler());

        //add global error logger
        config.Services.Add(typeof(IExceptionLogger), new GlobalExceptionLogger());           

    }

public class GlobalExceptionLogger : ExceptionLogger
{
    public override void Log(ExceptionLoggerContext context)
    {
        //This does not handle HttpRequestValidationException
        Exception exception = context.ExceptionContext.Exception;
        //.....

    }
}



public class GlobalExceptionHandler : ExceptionHandler
{
    public override void Handle(ExceptionHandlerContext context)
    {
        //This does not handle HttpRequestValidationException either ...

        var result = new HttpResponseMessage(HttpStatusCode.InternalServerError)
        {
            Content = new StringContent("An unexpected error occured. Please notify your administrator"),
            ReasonPhrase = "Unexpected Error"
        };

        context.Result = new UnhandledExceptionResult(context.Request, result);
    }

    public class UnhandledExceptionResult : IHttpActionResult
    {
        private HttpRequestMessage _request;
        private HttpResponseMessage _httpResponseMessage;

        public UnhandledExceptionResult(HttpRequestMessage request, HttpResponseMessage httpResponseMessage)
        {
            _request = request;
            _httpResponseMessage = httpResponseMessage;
        }

        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        {
            return Task.FromResult(_httpResponseMessage);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...