| | |
| | | using Microsoft.AspNetCore.Http; |
| | | using Microsoft.Extensions.Logging; |
| | | using Newtonsoft.Json; |
| | | using Org.BouncyCastle.Asn1.Ocsp; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Net; |
| | | using System.Text; |
| | | using System.Text.RegularExpressions; |
| | | using System.Threading.Tasks; |
| | | using WIDESEA_Core.Helper; |
| | | using WIDESEA_Core.LogHelper; |
| | |
| | | //todo |
| | | public async Task InvokeAsync(HttpContext context) |
| | | { |
| | | //if (AppSettings.app("Middleware", "RequestResponseLog", "Enabled").ObjToBool()) |
| | | { |
| | | // è¿æ»¤ï¼åªææ¥å£ |
| | | if (context.Request.Path.Value.Contains("api")) |
| | | { |
| | | context.Request.EnableBuffering(); |
| | | //Stream originalBody = context.Response.Body; |
| | | //if (App.ExpDateTime != null) |
| | | //{ |
| | | // if ((DateTime.Now - App.ExpDateTime.GetValueOrDefault()).TotalSeconds > 0) |
| | | // { |
| | | // await ReturnExpiredResponse(context, "ç³»ç»å·²è¿æï¼è¯·è系管çå"); |
| | | // return; |
| | | // } |
| | | // //var Hours = (App.ExpDateTime.GetValueOrDefault() - DateTime.Now).TotalHours; |
| | | // //if (Hours < 72) |
| | | // //{ |
| | | // // // è®°å½è¦åæ¥å¿ |
| | | // // _logger.LogWarning($"ç³»ç»å³å°å°æï¼å©ä½æ¶é´ï¼{Hours:F2}å°æ¶ï¼å°ææ¶é´ï¼{App.ExpDateTime.GetValueOrDefault():yyyy-MM-dd HH:mm:ss}"); |
| | | |
| | | // // // å¨ååºå¤´ä¸æ·»å å°ææç¤º |
| | | // // context.Response.Headers.Add("X-Expiration-Warning", |
| | | // // $"ç³»ç»å°å¨ {Hours:F2} å°æ¶åå°æ ({App.ExpDateTime.GetValueOrDefault():yyyy-MM-dd HH:mm:ss})"); |
| | | |
| | | // // // 妿éè¦ç´æ¥è¿åæç¤ºä¿¡æ¯ï¼åæ¶ä¸é¢ç注é |
| | | // // await ReturnExpirationWarningResponse(context, Hours); |
| | | // // return; |
| | | // //} |
| | | |
| | | //} |
| | | |
| | | // è¿æ»¤ï¼åªææ¥å£ |
| | | if (context.Request.Path.Value?.Contains("api") ?? false) |
| | | { |
| | | if (App.ExpDateTime != null) |
| | | { |
| | | if ((DateTime.Now - App.ExpDateTime.GetValueOrDefault()).TotalSeconds > 0 && !context.Request.Path.Value.Contains("getVierificationCode") && context.Request.Path.Value != "/api/User/login") |
| | | { |
| | | await ReturnExpiredResponse(context, "ç³»ç»å·²è¿æï¼è¯·è系管çå"); |
| | | return; |
| | | } |
| | | } |
| | | context.Request.EnableBuffering(); |
| | | Stream originalBody = context.Response.Body; |
| | | string requestParam = string.Empty; |
| | | string responseParam = string.Empty; |
| | | try |
| | | { |
| | | (context.RequestServices.GetService(typeof(RequestLogModel)) as RequestLogModel).RequestDate = DateTime.Now; |
| | | try |
| | | { |
| | | // åå¨è¯·æ±æ°æ® |
| | | //string requestParam = GetRequestData(context); |
| | | //DateTime beginDate = DateTime.Now; |
| | | requestParam = RequestDataLog(context); |
| | | context.Request.Body.Position = 0; |
| | | } |
| | | catch { } |
| | | using MemoryStream ms = new(); |
| | | context.Response.Body = ms; |
| | | |
| | | //using var ms = new MemoryStream(); |
| | | //context.Response.Body = ms; |
| | | await _next(context); |
| | | |
| | | await _next(context); |
| | | |
| | | try |
| | | { |
| | | // åå¨ååºæ°æ® |
| | | //DateTime endDate = DateTime.Now; |
| | | //string responseParam = GetResponsetData(context); |
| | | responseParam = ResponseDataLog(context.Response); |
| | | } |
| | | catch { } |
| | | |
| | | //context.Response.Body.Position = 0; |
| | | //await context.Response.Body.CopyToAsync(originalBody); |
| | | |
| | | //Logger.WriteApiLog2DB(context,requestParam, beginDate, responseParam, endDate, context.Response.StatusCode == 200 ? LoggerStatus.Success : LoggerStatus.Error); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // è®°å½å¼å¸¸ |
| | | _logger.LogError(ex.Message + "" + ex.InnerException); |
| | | } |
| | | finally |
| | | { |
| | | //context.Response.Body = originalBody; |
| | | } |
| | | ms.Position = 0; |
| | | await ms.CopyToAsync(originalBody); |
| | | if (!ShouldSkipLogging(context.Request.Path.Value)) |
| | | Logger.Add(requestParam, responseParam); |
| | | } |
| | | //else |
| | | //{ |
| | | // await _next(context); |
| | | //} |
| | | } |
| | | //else |
| | | //{ |
| | | // await _next(context); |
| | | //} |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // è®°å½å¼å¸¸ |
| | | |
| | | private string GetRequestData(HttpContext context) |
| | | { |
| | | try |
| | | { |
| | | using StreamReader sr = new StreamReader(context.Request.Body); |
| | | string request = JsonConvert.SerializeObject(sr.ReadToEnd()); ; |
| | | context.Request.Body.Position = 0; |
| | | return request; |
| | | } |
| | | finally |
| | | { |
| | | context.Response.Body = originalBody; |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | else |
| | | { |
| | | return $"请æ±åæ°è·åé误,{ex.Message}"; |
| | | await _next(context); |
| | | } |
| | | } |
| | | |
| | | private string GetResponsetData(HttpContext context) |
| | | /// <summary> |
| | | /// è¿åè¿æååº |
| | | /// </summary> |
| | | private async Task ReturnExpiredResponse(HttpContext context, string message) |
| | | { |
| | | try |
| | | context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; |
| | | context.Response.ContentType = "application/json; charset=utf-8"; |
| | | context.Response.Headers.ContentType= "application/json; charset=utf-8"; |
| | | var json = new WebResponseContent |
| | | { |
| | | using StreamReader sr = new StreamReader(context.Response.Body); |
| | | string response = JsonConvert.SerializeObject(sr.ReadToEnd()); ; |
| | | context.Response.Body.Position = 0; |
| | | return response; |
| | | } |
| | | catch (Exception ex) |
| | | Message = message, |
| | | Code = 500 |
| | | }; |
| | | |
| | | var jsonString = JsonConvert.SerializeObject(json); |
| | | await context.Response.WriteAsync(jsonString); |
| | | } |
| | | /// <summary> |
| | | /// è¿åå°æè¦åååºï¼å¯éï¼ |
| | | /// </summary> |
| | | private async Task ReturnExpirationWarningResponse(HttpContext context, double hoursRemaining) |
| | | { |
| | | context.Response.StatusCode = (int)HttpStatusCode.OK; |
| | | context.Response.ContentType = "application/json"; |
| | | |
| | | var expirationDate = App.ExpDateTime.GetValueOrDefault(); |
| | | var response = new |
| | | { |
| | | return $"ååºåæ°è·åé误,{ex.Message}"; |
| | | Code = 200, |
| | | Message = "ç³»ç»å³å°å°æè¦å", |
| | | Data = new |
| | | { |
| | | HoursRemaining = hoursRemaining, |
| | | ExpirationDate = expirationDate, |
| | | FormattedMessage = $"ç³»ç»å°å¨ {Math.Ceiling(hoursRemaining)} å°æ¶åå°æï¼å°ææ¶é´ï¼{expirationDate:yyyy-MM-dd HH:mm:ss}ã请è系管çåç»æã" |
| | | }, |
| | | Warning = true |
| | | }; |
| | | |
| | | var jsonString = JsonConvert.SerializeObject(response); |
| | | await context.Response.WriteAsync(jsonString); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 夿æ¯å¦è·³è¿æ¥å¿è®°å½ |
| | | /// </summary> |
| | | private bool ShouldSkipLogging(string path) |
| | | { |
| | | if (string.IsNullOrEmpty(path)) return false; |
| | | |
| | | var skipKeywords = new[] { "get", "Get", "query", "Query", "DownLoadApp", "downLoadApp", "UploadApp", "uploadApp" }; |
| | | return skipKeywords.Any(keyword => path.Contains(keyword, StringComparison.OrdinalIgnoreCase)); |
| | | } |
| | | |
| | | private string RequestDataLog(HttpContext context) |
| | | { |
| | | var request = context.Request; |
| | | |
| | | var sr = new StreamReader(request.Body); |
| | | |
| | | object obj; |
| | | string bodyData = sr.ReadToEndAsync().Result; |
| | | if (request.ContentLength <= 100000) |
| | | { |
| | | obj = new |
| | | { |
| | | QueryString = request.QueryString.ToString(), |
| | | BodyData = bodyData |
| | | }; |
| | | } |
| | | else |
| | | { |
| | | obj = new |
| | | { |
| | | QueryString = request.QueryString.ToString(), |
| | | BodyData = "" |
| | | }; |
| | | } |
| | | string data = JsonConvert.SerializeObject(obj); |
| | | |
| | | request.Body.Position = 0; |
| | | |
| | | return data; |
| | | } |
| | | |
| | | private string ResponseDataLog(HttpResponse response) |
| | | { |
| | | if (response.ContentLength <= 100000) |
| | | { |
| | | response.Body.Position = 0; |
| | | using StreamReader stream = new StreamReader(response.Body, leaveOpen: true); |
| | | string body = stream.ReadToEnd(); |
| | | response.Body.Position = 0; |
| | | return body; |
| | | } |
| | | return ""; |
| | | } |
| | | } |
| | | } |