private void HandleException(
            Exception ex,
            Nullable <EventId> eventId,
            HttpContext context,
            D dbContext,
            IOptions <NKitHttpExceptionHandlerMiddlewareSettings> middlewareSettings,
            ILogger <NKitHttpExceptionHandlerMiddleware <D> > logger,
            NKitEmailClientService emailClient)
        {
            if (context.Response.HasStarted)
            {
                logger.LogWarning(RESPONSE_STARTED_LOG_ERROR_MESSAGE);
                throw ex;
            }
            string message = ExceptionHandler.GetCompleteExceptionMessage(ex, middlewareSettings.Value.IncludeExceptionStackTraceInLoggerEntry);

            if (eventId.HasValue)
            {
                logger.Log(LogLevel.Error, eventId.Value, ex, message);
            }
            else
            {
                logger.Log(LogLevel.Error, ex, message);
            }
            dbContext.LogExceptionToNKitLogEntry(ex, eventId, middlewareSettings.Value.IncludeExceptionStackTraceInDatabaseNKitLogEntry);
            if (middlewareSettings.Value.SendEmailOnException)
            {
                emailClient.SendExceptionEmailNotification(ex, out string errorMessage, out string emailLogMessageText, middlewareSettings.Value.AppendHostNameToExceptionEmails, null);
            }
        }
 public NKitWebApiControllerCrud(
     D dbContext,
     IHttpContextAccessor
     httpContextAccessor,
     IOptions <NKitGeneralSettings> generalOptions,
     IOptions <NKitWebApiControllerSettings> webApiControllerOptions,
     IOptions <NKitDbContextSettings> databaseOptions,
     IOptions <NKitEmailClientServiceSettings> emailOptions,
     IOptions <NKitLoggingSettings> loggingOptions,
     IOptions <NKitWebApiClientSettings> webApiClientOptions,
     NKitEmailClientService emailClientService,
     ILogger logger) :
     base(dbContext, httpContextAccessor, generalOptions, webApiControllerOptions, databaseOptions, emailOptions, loggingOptions, webApiClientOptions, emailClientService, logger)
 {
 }
        public async Task Invoke(
            HttpContext context,
            D dbContext,
            IOptions <NKitHttpExceptionHandlerMiddlewareSettings> middlewareSettings,
            ILogger <NKitHttpExceptionHandlerMiddleware <D> > logger,
            NKitEmailClientService emailClient)
        {
            try
            {
                await _next(context);
            }
            catch (NKitHttpStatusCodeException ex)
            {
                HandleException(ex, ex.EventId, context, dbContext, middlewareSettings, logger, emailClient);
                NKitHttpExceptionResponse response = new NKitHttpExceptionResponse(ex, middlewareSettings.Value.IncludeStackTraceInExceptionResponse);
                string responseText = response.GetResponseText(middlewareSettings.Value.SerializerType, middlewareSettings.Value.ResponseContentType);
                context.Response.Clear();
                context.Response.StatusCode  = (int)ex.StatusCode;
                context.Response.ContentType = response.ContentType;
                await context.Response.WriteAsync(responseText);

                return;
            }
            catch (Exception ex)
            {
                HandleException(ex, null, context, dbContext, middlewareSettings, logger, emailClient);
                int httpStatusCode = (int)HttpStatusCode.InternalServerError;
                NKitHttpExceptionResponse response = new NKitHttpExceptionResponse(ex, httpStatusCode, null, null, middlewareSettings.Value.IncludeStackTraceInExceptionResponse);
                string responseText = response.GetResponseText(middlewareSettings.Value.SerializerType, middlewareSettings.Value.ResponseContentType);
                context.Response.Clear();
                context.Response.StatusCode  = httpStatusCode;
                context.Response.ContentType = response.ContentType;
                await context.Response.WriteAsync(responseText);

                return;
            }
            finally
            {
                if (dbContext != null)
                {
                    dbContext.Dispose();
                }
            }
        }
        public NKitWebApiController(
            D dbContext,
            IHttpContextAccessor httpContextAccessor,
            IOptions <NKitGeneralSettings> generalOptions,
            IOptions <NKitWebApiControllerSettings> webApiControllerOptions,
            IOptions <NKitDbContextSettings> databaseOptions,
            IOptions <NKitEmailClientServiceSettings> emailOptions,
            IOptions <NKitLoggingSettings> loggingOptions,
            IOptions <NKitWebApiClientSettings> webApiClientOptions,
            NKitEmailClientService emailClientService,
            ILogger logger)
        {
            DataValidator.ValidateObjectNotNull(dbContext, nameof(dbContext), nameof(NKitWebApiController <D>));
            DataValidator.ValidateObjectNotNull(httpContextAccessor, nameof(httpContextAccessor), nameof(NKitWebApiController <D>));

            DataValidator.ValidateObjectNotNull(generalOptions, nameof(generalOptions), nameof(NKitWebApiController <D>));
            DataValidator.ValidateObjectNotNull(webApiControllerOptions, nameof(webApiControllerOptions), nameof(NKitWebApiController <D>));
            DataValidator.ValidateObjectNotNull(databaseOptions, nameof(databaseOptions), nameof(NKitWebApiController <D>));
            DataValidator.ValidateObjectNotNull(emailOptions, nameof(emailOptions), nameof(NKitWebApiController <D>));
            DataValidator.ValidateObjectNotNull(loggingOptions, nameof(loggingOptions), nameof(NKitWebApiController <D>));
            DataValidator.ValidateObjectNotNull(webApiClientOptions, nameof(webApiClientOptions), nameof(NKitWebApiController <D>));

            _serviceInstanceId = Guid.NewGuid();

            _dbContext           = dbContext;
            _httpContextAccessor = httpContextAccessor;

            _generalSettings          = generalOptions.Value;
            _webApiControllerSettings = webApiControllerOptions.Value;
            _dbRepositorySettings     = databaseOptions.Value;
            _emailSettings            = emailOptions.Value;
            _loggingSettings          = loggingOptions.Value;
            _webApiClientSettings     = webApiClientOptions.Value;

            _emailClientService = emailClientService;
            _logger             = logger;
        }