public EmployeeController()
 {
     _apiRequestIdCacheManager     = IoC.Resolve <IApiRequestIdCacheManager>();
     _apiCacheManager              = IoC.Resolve <IApiCacheManager>();
     _employeeManager              = IoC.Resolve <IEmployeeManager>();
     _apiLogManager                = IoC.Resolve <IApiLogManager>();
     _employeeApiValidationManager = IoC.Resolve <IEmployeeApiValidationManager>();
 }
Exemple #2
0
 public ApiLogController(IApiLogManager apiLogManager)
 {
     _apiLogManager = apiLogManager;
 }
        public async Task Invoke(HttpContext httpContext, IApiLogManager apiLogManager, ILogger <APIResponseRequestLoggingMiddleware> logger, UserManager <ApplicationUser> userManager)
        {
            _logger        = logger;
            _apiLogManager = apiLogManager;

            try
            {
                var request = httpContext.Request;
                if (IsSwagger(httpContext) || !request.Path.StartsWithSegments(new PathString("/api")))
                {
                    await _next(httpContext);
                }
                else
                {
                    Stopwatch stopWatch   = Stopwatch.StartNew();
                    var       requestTime = DateTime.UtcNow;

                    var formattedRequest = await FormatRequest(request);

                    var originalBodyStream = httpContext.Response.Body;

                    using (var responseBody = new MemoryStream())
                    {
                        httpContext.Response.Body = responseBody;

                        try
                        {
                            var response = httpContext.Response;
                            response.Body = responseBody;
                            await _next.Invoke(httpContext);

                            string responseBodyContent = null;

                            if (httpContext.Response.StatusCode == Status200OK)
                            {
                                responseBodyContent = await FormatResponse(response);
                                await HandleSuccessRequestAsync(httpContext, responseBodyContent, Status200OK);
                            }
                            else
                            {
                                await HandleNotSuccessRequestAsync(httpContext, httpContext.Response.StatusCode);
                            }

                            stopWatch.Stop();

                            #region Log Request / Response
                            //Search the Ignore paths from appsettings to ignore the loggin of certian api paths
                            if (_enableAPILogging && (_ignorePaths.Any(e => !request.Path.StartsWithSegments(new PathString(e.ToLower())))))
                            {
                                try
                                {
                                    await responseBody.CopyToAsync(originalBodyStream);

                                    //User id = "sub" y default
                                    ApplicationUser user = httpContext.User.Identity.IsAuthenticated
                                            ? await userManager.FindByIdAsync(httpContext.User.Claims.Where(c => c.Type == JwtClaimTypes.Subject).First().Value)
                                            : null;

                                    await SafeLog(requestTime,
                                                  stopWatch.ElapsedMilliseconds,
                                                  response.StatusCode,
                                                  request.Method,
                                                  request.Path,
                                                  request.QueryString.ToString(),
                                                  formattedRequest,
                                                  responseBodyContent,
                                                  httpContext.Connection.RemoteIpAddress.ToString(),
                                                  user
                                                  );
                                }
                                catch (Exception ex)
                                {
                                    _logger.LogWarning("An Inner Middleware exception occurred on SafeLog: " + ex.Message);
                                }
                            }
                            #endregion
                        }
                        catch (System.Exception ex)
                        {
                            _logger.LogWarning("An Inner Middleware exception occurred: " + ex.Message);
                            await HandleExceptionAsync(httpContext, ex);
                        }
                        finally
                        {
                            responseBody.Seek(0, SeekOrigin.Begin);
                            await responseBody.CopyToAsync(originalBodyStream);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // We can't do anything if the response has already started, just abort.
                if (httpContext.Response.HasStarted)
                {
                    _logger.LogWarning("A Middleware exception occurred, but response has already started!");
                    throw;
                }

                await HandleExceptionAsync(httpContext, ex);

                throw;
            }
        }