RequestResponseLogging.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. using AipGateway.AIP;
  2. using AipGateway.API.Application.Modules;
  3. using AipGateway.API.Application.UtilityServices;
  4. using AipGateway.API.Domain.Common.Utilities;
  5. using AipGateway.API.Domain.Entities;
  6. using AipGateway.API.Domain.IRepositories.IGenericRepositories;
  7. using AipGateway.API.Domain.Models;
  8. using AipGateway.API.Domain.Models.Request;
  9. using AipGateway.API.Domain.Models.Response;
  10. using AipGateway.API.Infrastructure.DataAccess;
  11. using AipGateway.API.Infrastructure.Persistence;
  12. using Azure.Core;
  13. using Microsoft.AspNetCore.Http;
  14. using Microsoft.Extensions.DependencyInjection;
  15. using Microsoft.Extensions.Logging;
  16. using Newtonsoft.Json;
  17. using System.Net;
  18. using System.Text;
  19. namespace AipGateway.API.Application.Pipeline.Middlewares.Logging
  20. {
  21. public class RequestResponseLogging
  22. {
  23. private readonly ILogger<RequestResponseLogging> _log;
  24. private readonly RequestDelegate _next;
  25. public RequestResponseLogging(ILogger<RequestResponseLogging> logger, RequestDelegate next)
  26. {
  27. _log = logger;
  28. _next = next;
  29. _log.LogError("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@: RequestResponseLogging");
  30. }
  31. //you can not inject it as a constructor parameter in Middleware because only Singleton services can be resolved by constructor injection in Middleware.
  32. public async Task Invoke(HttpContext context, IUnitOfWork unitOfWork)
  33. {
  34. //_logger.LogError("RequestResponseLogging Invoke Before:");
  35. string requestUrl = $"{context.Request.Scheme}://{context.Request.Host}{context.Request.Path} {context.Request.QueryString}".Trim();
  36. if (requestUrl.Contains(GlobalConstants.API_ENDPOINT))
  37. {
  38. string guid = GlobalConstants.GetApiGuid(context);
  39. var apiLog = await FormatRequest(context);
  40. var originalBodyStream = context.Response.Body;
  41. string response = "";
  42. using (var responseBody = new MemoryStream())
  43. {
  44. context.Response.Body = responseBody;
  45. try
  46. {
  47. await _next.Invoke(context);
  48. response = await FormatResponse(context.Response);
  49. apiLog.ResponseStatusCode = context.Response.StatusCode;
  50. if (context.Response.StatusCode != (int)HttpStatusCode.OK)
  51. {
  52. var errorModel = JsonConvert.DeserializeObject<ApiErrorResponseModel>(response);
  53. if (errorModel != null)
  54. {
  55. apiLog.ErrorCode = errorModel.errorCode;
  56. apiLog.ErrorMessage = errorModel.Message;
  57. }
  58. }
  59. }
  60. catch (Exception ex)
  61. {
  62. apiLog.ResponseStatusCode = context.Response.StatusCode;
  63. }
  64. apiLog.ApiGuid = guid;
  65. apiLog.ResponseAt = DateTime.Now;
  66. TimeSpan timeDiff = apiLog.ResponseAt - apiLog.RequestAt;
  67. apiLog.ResponseTime = timeDiff.Milliseconds;
  68. if (!response.ToLower().Contains("healthy") || !requestUrl.ToLower().Contains("swagger"))
  69. {
  70. await unitOfWork.AipApiCallLogRepository.AddAsync(apiLog);
  71. unitOfWork.Complete();
  72. }
  73. if (context.Request.Method == HttpMethod.Post.ToString())
  74. {
  75. int apiId = GlobalConstants.GetApiId(context);
  76. if ((apiId >= GlobalConstants.API_FILE_INFO && apiId <= GlobalConstants.API_FILE_DELETE_LABEL_PROTECTION) ||
  77. (apiId >= GlobalConstants.API_STREAM_INFO || apiId <= GlobalConstants.API_STREAM_DELETE_LABEL_PROTECTION))
  78. {
  79. TbAipFileJobLog fileJobLog = new TbAipFileJobLog
  80. {
  81. FileId = guid,
  82. FileName = "",
  83. FileExt = "",
  84. FileOwner = "",
  85. FileLabelGuid = "",
  86. FileProtectionGuid = "",
  87. FileSize = 0,
  88. NewFileName = string.Empty,
  89. NewFileExt = string.Empty,
  90. NewFileOwner = string.Empty,
  91. NewFileLabelGuid = string.Empty,
  92. NewFileProtectionGuid = string.Empty,
  93. NewFileSize = 0,
  94. ApiGuid = guid,
  95. ApiId = apiId,
  96. ServerIpAddr = context.Connection.RemoteIpAddress?.ToString(),
  97. JobOwner = string.Empty,
  98. ApiKey = string.Empty,
  99. DecryptKey = string.Empty,
  100. JobResult = 0,
  101. JobMessage = string.Empty,
  102. JobTime = apiLog.ResponseTime,
  103. };
  104. RequestBase? req = context.Items[GlobalConstants.API_REQUEST] as RequestBase;
  105. if (req != null)
  106. {
  107. fileJobLog.ApiKey = req.apiKey;
  108. fileJobLog.DecryptKey = req.DecryptKey;
  109. fileJobLog.JobOwner = req.email;
  110. }
  111. ResponseBase? res = context.Items[GlobalConstants.API_RESULT] as ResponseBase;
  112. if (res != null)
  113. {
  114. fileJobLog.JobResult = res.errorCode;
  115. fileJobLog.JobMessage = res.errorMessage;
  116. fileJobLog.FileName = res.dispFileName;
  117. fileJobLog.FileOwner = res.FileOwner;
  118. fileJobLog.FileExt = res.FileExt;
  119. fileJobLog.FileSize = res.FileSize;
  120. fileJobLog.FileLabelGuid = res.FileLabelGuid;
  121. fileJobLog.FileProtectionGuid = res.FileProtectionGuid;
  122. fileJobLog.NewFileName = res.NewFileName;
  123. fileJobLog.NewFileOwner = res.NewFileOwner;
  124. fileJobLog.NewFileExt = res.NewFileExt;
  125. fileJobLog.NewFileSize = res.NewFileSize;
  126. fileJobLog.NewFileLabelGuid = res.NewFileLabelGuid;
  127. fileJobLog.NewFileProtectionGuid = res.NewFileProtectionGuid;
  128. }
  129. await unitOfWork.AipFileJobLogRepository.AddAsync(fileJobLog);
  130. unitOfWork.Complete();
  131. } // API
  132. } // POST
  133. await responseBody.CopyToAsync(originalBodyStream);
  134. }
  135. }
  136. else
  137. {
  138. await _next.Invoke(context);
  139. }
  140. _log.LogError("RequestResponseLogging.........................................................................");
  141. }
  142. private static async Task<TbAipApiCallLog> FormatRequest(HttpContext context)
  143. {
  144. context.Request.EnableBuffering();
  145. var buffer = new byte[Convert.ToInt32(context.Request.ContentLength)];
  146. await context.Request.Body.ReadAsync(buffer);
  147. var bodyAsText = Encoding.UTF8.GetString(buffer);
  148. context.Request.Body.Position = 0;
  149. var logDto = new TbAipApiCallLog
  150. {
  151. RequestAt = DateTime.Now,
  152. ApiEndPoint = context.Request.Path,
  153. IPAddress = context.Connection.RemoteIpAddress?.ToString(),
  154. };
  155. //context.Items["RequestLog"] = logDto;
  156. return logDto;
  157. }
  158. private static async Task<string> FormatResponse(HttpResponse response)
  159. {
  160. response.Body.Seek(0, SeekOrigin.Begin);
  161. string text = await new StreamReader(response.Body).ReadToEndAsync();
  162. response.Body.Seek(0, SeekOrigin.Begin);
  163. return text;
  164. }
  165. }
  166. }