public static void UseExceptionHandlerMiddleware(this IApplicationBuilder builder)
        {
            builder.Run(async context =>
            {
                var errorFeature = context.Features.Get <IExceptionHandlerFeature>();
                var exception    = errorFeature.Error;
                if (exception is DomainException)
                {
                    var domainException          = exception as DomainException;
                    context.Response.StatusCode  = StatusCodes.Status400BadRequest;
                    context.Response.ContentType = "application/json";
                    var error = new DomainExceptionContract()
                    {
                        Key     = domainException.Key,
                        Message = domainException.Message
                    };

                    await context.Response.WriteAsync(error.ToString());
                }
                else if (exception is ForbiddenException)
                {
                    context.Response.StatusCode  = StatusCodes.Status403Forbidden;
                    context.Response.ContentType = "application/json";
                    var error = new DomainExceptionContract()
                    {
                        Key     = "Forbidden",
                        Message = "Forbidden"
                    };

                    await context.Response.WriteAsync(error.ToString());
                }
                else
                {
                    var loggerFactory   = builder.ApplicationServices.GetService(typeof(ILoggerFactory)) as ILoggerFactory;
                    var exceptionLogger = loggerFactory.CreateLogger(typeof(ExceptionHandlerMiddlewareExceptions));
                    exceptionLogger.LogError(exception, "Exception");

                    context.Response.StatusCode = StatusCodes.Status500InternalServerError;
                }
            });
        }
        public async Task Invoke(HttpContext context)
        {
            try
            {
                await _next(context);
            }
            catch (DomainException domainException)
            {
                var error = new DomainExceptionContract()
                {
                    Key     = domainException.Key,
                    Message = domainException.Message
                };

                _logger.LogError(domainException, domainException.Message);

                await WriteErrorMessageToResponse(context, HttpStatusCode.BadRequest, error);
            }
            catch (ForbiddenException)
            {
                var error = new DomainExceptionContract()
                {
                    Key     = "Forbidden",
                    Message = "Forbidden"
                };

                await WriteErrorMessageToResponse(context, HttpStatusCode.Forbidden, error);
            }
            catch (Exception ex)
            {
                var error = new DomainExceptionContract()
                {
                    Key     = "InternalServerError",
                    Message = ex.Message
                };

                _logger.LogError(ex, ex.Message, new object[] { });

                await WriteErrorMessageToResponse(context, HttpStatusCode.InternalServerError, error);
            }
        }
        private async Task WriteErrorMessageToResponse(HttpContext context, HttpStatusCode httpStatusCode, DomainExceptionContract error)
        {
            context.Response.Headers[HeaderNames.CacheControl] = "no-cache";
            context.Response.Headers[HeaderNames.Pragma]       = "no-cache";
            context.Response.Headers[HeaderNames.Expires]      = "-1";
            context.Response.Headers.Remove(HeaderNames.ETag);

            var result = JsonConvert.SerializeObject(error);

            context.Response.ContentType = "application/json";
            context.Response.StatusCode  = (int)httpStatusCode;
            await context.Response.WriteAsync(result);
        }