public async Task ServerSentEvents3Async() { if (!isEnableRealTimeLog) { return; } Response.OnStarting(() => { Response.Headers["Content-Type"] = "text/event-stream;charset=UTF-8"; Response.Headers["Cache-Control"] = "no-cache"; Response.Headers["Connection"] = "keep-alive"; var requestInfoList = app.GetAllRequestInfo(); var info = new StringBuilder(); if (requestInfoList.Count > 0) { var ipList = requestInfoList.GroupBy(x => x.ClientIpAddress).Select(x => new { ClientIpAddress = x.Key, Count = x.Count() }).ToList(); var sessionCount = requestInfoList.GroupBy(x => x.SessionID).Count(); info.Append($"<h4>{(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))} 接口{HtmlColor.FormatWith("#0000FF", requestInfoList.Count)} "); info.Append($"客户端{HtmlColor.FormatWith("#0000FF", sessionCount)} "); info.Append($"IP{HtmlColor.FormatWith("#0000FF", ipList.Count)}</h4>"); foreach (var item in ipList) { info.Append($"<a href=\"http://www.ip138.com/ips138.asp?ip={item.ClientIpAddress}&action=2\" target=\"_blank\">{item.ClientIpAddress ?? "ClientIpAddress ??"}</a>({item.Count}) "); } info.Append("<br>"); foreach (var item in requestInfoList) { var times = (int)((item.EndTime == DateTime.MinValue ? DateTime.Now : item.EndTime) - item.StartTime).TotalMilliseconds; var timesDesc = (times > 2000 ? HtmlColor.FormatWith("#FF0000", times) : (times > 300 ? HtmlColor.FormatWith("#FFB354", times) : (item.EndTime == DateTime.MinValue ? times.ToString() : HtmlColor.FormatWith("#00FF00", times)))); info.Append($"{(string.IsNullOrEmpty(item.ClientIpAddress) ? "未知用户" : item.ClientIpAddress)} "); info.Append($"{(item.UserID == 0 ? (string.IsNullOrEmpty(item.SessionID) ? "未知用户" : item.SessionID) : "用户" + item.UserID.ToString())} "); info.Append($"{item.StartTime.ToString("HH:mm:ss")} "); info.Append($"{timesDesc} "); info.Append($"RequestApi:{item.RequestApi ?? string.Empty}<br>"); } } string data = Convert.ToBase64String(Encoding.UTF8.GetBytes(info.ToString())); data = ServerSentEventData(data, DateTime.Now.Ticks.ToString());//, "message", 300); Response.HttpContext.Response.Body.Write(Encoding.UTF8.GetBytes(data), 0, data.Length); return(Task.FromResult(0)); }); }