Example #1
0
 private static void WriteLog(HttpMiddlewareModel model)
 {
     if (!model.Request.Url.Contains("swagger") && !model.Request.Url.Contains("html"))
     {
         _logger.LogDebug("============================================================================");
         _logger.LogDebug($"Start:{model.ExecuteStart}");
         _logger.LogDebug($"Url:{model.Request.Url}");
         _logger.LogDebug($"Header:");
         _logger.LogDebug($"{string.Join("\r\n                          ", model.Request.Header.ToArray())}");
         _logger.LogDebug($"Request:{model.Request.Param}");
         _logger.LogDebug($"Response:");
         _logger.LogDebug($"{JsonConvert.SerializeObject(model.Response)}");
         _logger.LogDebug($"End:{model.ExecuteEnd}");
         _logger.LogDebug($"ElapsedTime:{model.ElapsedTime}");
         _logger.LogDebug("============================================================================");
     }
 }
Example #2
0
        /// <summary>
        /// 拦截请求参数打印日志
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task Invoke(HttpContext context)
        {
            _stopwatch.Restart();
            var request = context.Request;

            if (request.Path.Value.Contains("upload") || request.Path.Value.EndsWith(".dll"))
            {
                await _next(context);
            }
            else
            {
                var model = new HttpMiddlewareModel()
                {
                };
                model.Request        = new RequestBody();
                model.ExecuteStart   = DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
                model.Request.Url    = request.Path.ToString();
                model.Request.Header = request.Headers.ToDictionary(x => x.Key, v => string.Join(";", v.Value.ToList()));
                model.Request.Method = request.Method;

                try
                {
                    // 获取请求body内容
                    if (request.Method.ToLower().Equals("post"))
                    {
                        // 启用倒带功能,就可以让 Request.Body 可以再次读取
                        request.EnableBuffering();
                        Stream stream = request.Body;
                        byte[] buffer = new byte[request.ContentLength.Value];
                        await stream.ReadAsync(buffer, 0, buffer.Length);

                        model.Request.Param   = Encoding.Default.GetString(buffer);
                        request.Body.Position = 0;
                    }
                    else if (request.Method.ToLower().Equals("get"))
                    {
                        model.Request.Param = request.QueryString.Value;
                    }

                    //// 获取Response.Body内容
                    var originalBodyStream = context.Response.Body;
                    await using var responseBody = new MemoryStream();
                    context.Response.Body        = responseBody;
                    try
                    {
                        await _next(context);
                    }
                    catch (Exception ex)
                    {
                        await HandleExceptionAsync(context, ex);
                    }
                    model.Response = await GetResponse(context.Response);

                    model.ExecuteEnd = DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
                    await responseBody.CopyToAsync(originalBodyStream);
                }
                catch (Exception ex)
                {
                    await HandleExceptionAsync(context, ex);
                }
                // 响应完成记录时间和存入日志
                context.Response.OnCompleted(() =>
                {
                    _stopwatch.Stop();
                    model.ElapsedTime = $"{_stopwatch.ElapsedMilliseconds }ms";
                    WriteLog(model);
                    return(Task.CompletedTask);
                });
            }
        }