public async Task InvokeAsync(HttpContext context) { if (Appsettings.app("Middleware", "RequestResponseLog", "Enabled").ObjToBool()) { // 过滤,只有接口 if (context.Request.Path.Value.ToLower().Contains("api")) { _stopwatch.Restart(); HttpRequest request = context.Request; RequestResponseLogAPIModel requestResponseLogAPIModel = new RequestResponseLogAPIModel(); requestResponseLogAPIModel.UserID = ""; //用户ID待后续增加用户再增加 requestResponseLogAPIModel.IP = HttpContextHelper.GetClientIP(context); //获取IP requestResponseLogAPIModel.Agent = request.Headers["User-Agent"].ObjToString(); //获取Agent浏览器信息 requestResponseLogAPIModel.RequestMethod = request.Method; //获取请求类型 requestResponseLogAPIModel.API = request.Host.Value.ObjToString() + request.Path.Value.ObjToString(); requestResponseLogAPIModel.BeginTime = DateTime.Now; //请求开始时间 //获取请求body内容 if (request.Method.ToLower().Equals("post") || request.Method.ToLower().Equals("put")) { // 启用倒带功能,就可以让 Request.Body 可以再次读取 request.EnableBuffering(); Stream stream = request.Body; byte[] buffer = new byte[request.ContentLength.Value]; stream.Read(buffer, 0, buffer.Length); requestResponseLogAPIModel.RequestData = Encoding.UTF8.GetString(buffer); //获取请求信息data } else if (request.Method.ToLower().Equals("get") || request.Method.ToLower().Equals("delete")) { //获取请求信息data requestResponseLogAPIModel.RequestData = HttpUtility.UrlDecode(request.QueryString.ObjToString(), Encoding.UTF8); } // 获取Response.Body内容 var originalBodyStream = context.Response.Body; using (var responseBody = new MemoryStream()) { context.Response.Body = responseBody; await _next(context); var responseBodyData = await GetResponse(context.Response); requestResponseLogAPIModel.ResponseData = responseBodyData; //获取返回信息data await responseBody.CopyToAsync(originalBodyStream); } // 响应完成记录时间和存入日志 context.Response.OnCompleted(() => { _stopwatch.Stop(); requestResponseLogAPIModel.EndTime = DateTime.Now; // 响应结束时间 requestResponseLogAPIModel.OPTime = _stopwatch.ElapsedMilliseconds.ObjToString(); //请求响应时间毫秒 //// 自定义log输出 //var requestInfo = JsonConvert.SerializeObject(userAccessModel); //Parallel.For(0, 1, e => //{ // LogLock.OutSql2Log("RecordAccessLogs", new string[] { requestInfo + "," }, false); //}); return(Task.CompletedTask); }); //将请求响应信息推送至rabbitMQ中,让Receive程序进行记录 //await _eventBusRabbitMQ.PublishAsync(Appsettings.app("RabbitMQ", "QueueName", "RequestResponseLogMildd"), requestResponseLogModel); HttpWebClient httpWebClient = new HttpWebClient(_httpClientFactory); requestResponseLogAPIModel.MQQueueName = Appsettings.app("RabbitMQ", "QueueName", "RequestResponseLogMildd"); await httpWebClient.PostAsync(Appsettings.app("API", "Url", "HostUrl") + Appsettings.app("API", "MQ", "RabbitMQPublishUrl"), JsonConvert.SerializeObject(requestResponseLogAPIModel)); } else { await _next(context); } } else { await _next(context); } }