Ejemplo n.º 1
0
        private static async Task <IActionResult> HandleDomainException(HandleActionRequest request,
                                                                        AggregateException domainExceptions)
        {
            //it is most likely an error because the UI validation passed but something happened when processing the request... 3rd party service down,etc...


            LogError();

            if (domainExceptions.InnerExceptions.Any(x => !(x is Exception) && !(x is ValidationException)))
            {
                //this is an unhandled exception--> bubble up and let the general exception mechanism take over(show error page)
                throw new AggregateException(domainExceptions.InnerExceptions.Where(x =>
                                                                                    !(x is Exception) && !(x is ValidationException)));
            }

            foreach (var ex in domainExceptions.InnerExceptions.Where(x => x is Exception)
                     .Cast <Exception>())
            {
                if (request.OnCustomErrorHandling != null)
                {
                    request.OnCustomErrorHandling(ex);
                }
                else
                {
                    //TODO: Add token replacement mechanims and keep this code


                    //key= "" --> adds to the validation summary
                    request.TargetController.ModelState.AddModelError(string.Empty, ex.Message);
                }
            }

            foreach (var ex in domainExceptions.InnerExceptions.Where(x => x is ValidationException)
                     .Cast <ValidationException>())
            {
                //key= "" --> adds to the validation summary
                request.TargetController.ModelState.AddModelError(string.Empty, ex.Message);
            }

            return(await BuildInvalidResult(request));

            void LogError()
            {
                var sb = new StringBuilder();

                foreach (var exception in domainExceptions.InnerExceptions)
                {
                    if (exception is Exception)
                    {
                        var ex = (Exception)exception;
                        sb.AppendLine($"{exception}");
                    }
                    else
                    {
                        sb.AppendLine(exception.ToString());
                    }
                }
                Logger.Error(() => sb.ToString());
            }
        }
Ejemplo n.º 2
0
        private static async Task <IActionResult> HandleActionAsync(HandleActionRequest request)
        {
            if (request.TargetController.Request != null)
            {
                Logger.Debug(() => $"Start Handling: {request.TargetController.Request.GetDisplayUrl()}");
            }

            IActionResult result = null;

            try
            {
                if (request.OnErrorUseThisResultProvider == null || request.TargetController.ModelState.IsValid)
                {
                    result = await request.ControllerActionHandler();
                }
                else
                {
                    result = await BuildInvalidResult(request);
                }
            }
            //Domain only throws Aggregate exceptions
            catch (AggregateException domainExceptions)
            {
                result = await HandleDomainException(request, domainExceptions);
            }

            if (request.TargetController.Request != null)
            {
                Logger.Debug(() => $"Completed Handling: {request.TargetController.Request.GetDisplayUrl()}");
            }
            return(result);
        }
Ejemplo n.º 3
0
        private static async Task <IActionResult> BuildInvalidResult(HandleActionRequest request)
        {
            IActionResult result;

            if (request.StoreErrorsOn != null)
            {
                var errors = new List <string>();
                foreach (var modelState in request.TargetController.ModelState.Values)
                {
                    foreach (var error in modelState.Errors)
                    {
                        errors.Add(error.ErrorMessage);
                    }
                }

                request.StoreErrorsOn.ErrorMessages = errors;
            }

            result = await request.OnErrorUseThisResultProvider(request.StoreErrorsOn);

            return(result);
        }