Example #1
0
        public async Task InvokeAsync(HttpContext context)
        {
            var stopWatch = System.Diagnostics.Stopwatch.StartNew();

            context.Request.EnableBuffering();

            var originalBodyStream = context.Response.Body;

            using var responseBody = new MemoryStream();
            context.Response.Body  = responseBody;
            var           level         = CurrentLoggingLevel;
            HttpEventData httpEventData = new HttpEventData();

            var template = level < LogEventLevel.Information
                ? DBG_LOG_TEMPLATE
                : INF_LOG_TEMPLATE;

            try
            {
                await Next(context);

                httpEventData = await ReadRequestInfo(context);
            }
            catch (Exception ex)
            {
                template = ERR_LOG_TEMPLATE;
                level    = LogEventLevel.Error;
                httpEventData.Exception     = ex;
                context.Response.StatusCode = 500;
                httpEventData.StatusCode    = 500;
            }
            finally
            {
                httpEventData.ElapsedMS = stopWatch.ElapsedMilliseconds;
                var data = httpEventData.GetEventData(Settings.LogLevel);

                if (level >= LogEventLevel.Error)
                {
                    Logger.Error(template, data);
                }
                else
                {
                    Logger.Information(template, data);
                }

                await responseBody.CopyToAsync(originalBodyStream);
            }
        }
Example #2
0
        private async Task <HttpEventData> ReadRequestInfo(HttpContext context)
        {
            var body = context.Request.Body;

            var routeData = context.GetRouteData();

            var controller = routeData != null ? routeData.Values["controller"]?.ToString().SafeString() :
                             "controller_not_available";

            var action = routeData != null ? routeData.Values["action"]?.ToString().SafeString() :
                         "action_not_available";

            var buffer = new byte[Convert.ToInt32(context.Request.ContentLength)];

            await context.Request.Body.ReadAsync(buffer, 0, buffer.Length);

            context.Request.Body = body;

            var requestData = new HttpEventData()
            {
                ControllerName = controller,
                ActionName     = action,
                RequestBody    = System.Text.Encoding.UTF8.GetString(buffer),
                Method         = context.Request.Method,
                UserID         = context.User.Identity.Name
            };

            context.Response.Body.Seek(0, SeekOrigin.Begin);

#pragma warning disable IDE0067
            requestData.ResponseBody = await new StreamReader(context.Response.Body).ReadToEndAsync();
#pragma warning restore IDE0067

            requestData.StatusCode = context.Response.StatusCode;
            context.Response.Body.Seek(0, SeekOrigin.Begin);
            requestData.RequestPath = context.Request.GetDisplayUrl();

            return(requestData);
        }