public static void RequestFilter(IHttpRequest req, IHttpResponse res, object requestDto)
        {
            var validator = ValidatorCache.GetValidator(req, requestDto.GetType());

            if (validator == null)
            {
                return;
            }

            var validatorWithHttpRequest = validator as IRequiresHttpRequest;

            if (validatorWithHttpRequest != null)
            {
                validatorWithHttpRequest.HttpRequest = req;
            }

            var ruleSet          = req.HttpMethod;
            var validationResult = validator.Validate(
                new ValidationContext(requestDto, null, new MultiRuleSetValidatorSelector(ruleSet)));

            if (validationResult.IsValid)
            {
                return;
            }

            // mark request validation exception
            res.ExecutionResult.ValidationExceptionThrown = true;

            // find response type
            Type responseType = string.IsNullOrEmpty(req.OperationName) ? null : EndpointHost.Config.MetadataMap[req.ServicePath].GetResponseTypeByOpName(req.OperationName);

            var errorResponse = ErrorUtils.CreateValidationErrorResponse(
                req, validationResult.ToException(), responseType);

            var validationFeature = EndpointHost.GetPlugin <ValidationFeature>();

            if (validationFeature != null && validationFeature.ErrorResponseFilter != null)
            {
                errorResponse = validationFeature.ErrorResponseFilter(validationResult, errorResponse);
            }

            res.WriteToResponse(req, errorResponse);
        }