2025-08-24 16:18:41 +08:00
|
|
|
|
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
|
|
|
|
|
//
|
|
|
|
|
|
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
|
|
|
|
|
//
|
|
|
|
|
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
2025-08-20 09:10:10 +08:00
|
|
|
|
|
|
|
|
|
|
namespace Admin.NET.Core;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// http日志处理
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class HttpLoggingHandler : DelegatingHandler, ITransient
|
|
|
|
|
|
{
|
2025-08-30 14:10:38 +08:00
|
|
|
|
private readonly Dictionary<string, HttpRemoteItem> _optionMap;
|
2025-08-20 09:10:10 +08:00
|
|
|
|
private readonly SysConfigService _sysConfigService;
|
|
|
|
|
|
private readonly IEventPublisher _eventPublisher;
|
|
|
|
|
|
|
2025-08-26 09:04:53 +08:00
|
|
|
|
public HttpLoggingHandler(IEventPublisher eventPublisher, SysConfigService sysConfigService)
|
2025-08-20 09:10:10 +08:00
|
|
|
|
{
|
|
|
|
|
|
_eventPublisher = eventPublisher;
|
|
|
|
|
|
_sysConfigService = sysConfigService;
|
2025-08-30 14:10:38 +08:00
|
|
|
|
_optionMap = App.Configuration.GetSection("HttpRemotes").GetChildren()
|
|
|
|
|
|
.Select(u => u.Get<HttpRemoteItem>())
|
|
|
|
|
|
.ToDictionary(opt => opt.HttpName, opt => opt);
|
2025-08-20 09:10:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
|
|
|
|
|
|
CancellationToken cancellationToken)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 判断全局Http日志开关
|
|
|
|
|
|
var enabledLog = await _sysConfigService.GetConfigValueByCode<bool>(ConfigConst.SysLogHttp);
|
|
|
|
|
|
if (!enabledLog) return await base.SendAsync(request, cancellationToken);
|
|
|
|
|
|
|
|
|
|
|
|
// 判断当前配置日志开关
|
2025-08-28 10:31:30 +08:00
|
|
|
|
var httpClientName = request.GetHttpClientName();
|
|
|
|
|
|
var attr = request.GetHttpRemoteApiAttr();
|
2025-08-30 14:10:38 +08:00
|
|
|
|
if (!string.IsNullOrWhiteSpace(httpClientName)) enabledLog = _optionMap.GetOrDefault(httpClientName).EnabledLog;
|
2025-08-28 10:31:30 +08:00
|
|
|
|
if (!enabledLog || attr?.IgnoreLog == true) return await base.SendAsync(request, cancellationToken);
|
2025-08-20 09:10:10 +08:00
|
|
|
|
|
2025-08-24 00:09:42 +08:00
|
|
|
|
var stopWatch = Stopwatch.StartNew();
|
2025-08-31 20:08:47 +08:00
|
|
|
|
var userManger = LazyHelper.GetService<UserManager>();
|
2025-08-24 17:51:58 +08:00
|
|
|
|
var urlList = request.RequestUri?.LocalPath.Split("/") ?? [];
|
2025-08-24 16:15:05 +08:00
|
|
|
|
var sysLogHttp = new SysLogHttp
|
|
|
|
|
|
{
|
2025-08-28 10:31:30 +08:00
|
|
|
|
HttpApiDesc = attr?.Desc,
|
|
|
|
|
|
HttpClientName = httpClientName,
|
2025-08-24 16:15:05 +08:00
|
|
|
|
HttpMethod = request.Method.Method,
|
2025-08-24 17:51:58 +08:00
|
|
|
|
ActionName = urlList.Length >= 2 ? $"{urlList[^2]}/{urlList[^1]}" : urlList.Length >= 1 ? urlList[^1] : null,
|
2025-08-24 16:15:05 +08:00
|
|
|
|
RequestUrl = request.RequestUri?.ToString(),
|
2025-08-24 17:51:58 +08:00
|
|
|
|
RequestHeaders = request.Headers.ToDictionary(u => u.Key, u => u.Value.Join(";")).ToJson(),
|
2025-08-28 10:31:30 +08:00
|
|
|
|
RequestBodyPlaintext = request.GetRequestBodyPlaintext(),
|
2025-08-31 20:08:47 +08:00
|
|
|
|
TenantId = userManger?.TenantId,
|
|
|
|
|
|
CreateUserId = userManger?.UserId,
|
|
|
|
|
|
CreateUserName = userManger?.RealName,
|
2025-08-24 16:15:05 +08:00
|
|
|
|
};
|
2025-08-20 09:10:10 +08:00
|
|
|
|
if (request.Content != null) sysLogHttp.RequestBody = await request.Content.ReadAsStringAsync(cancellationToken);
|
|
|
|
|
|
|
|
|
|
|
|
sysLogHttp.StartTime = DateTime.Now;
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
var response = await base.SendAsync(request, cancellationToken);
|
|
|
|
|
|
stopWatch.Stop();
|
|
|
|
|
|
sysLogHttp.EndTime = DateTime.Now;
|
2025-08-24 00:09:42 +08:00
|
|
|
|
sysLogHttp.StatusCode = response.StatusCode;
|
2025-08-28 10:31:30 +08:00
|
|
|
|
sysLogHttp.ResponseBodyPlaintext = await response.GetResponseBodyPlaintext();
|
2025-08-20 09:10:10 +08:00
|
|
|
|
sysLogHttp.ResponseHeaders = response.Headers.ToDictionary(u => u.Key, u => u.Value.Join(";")).ToJson();
|
|
|
|
|
|
sysLogHttp.IsSuccessStatusCode = response.IsSuccessStatusCode ? YesNoEnum.Y : YesNoEnum.N;
|
|
|
|
|
|
sysLogHttp.ResponseBody = await response.Content.ReadAsStringAsync(cancellationToken);
|
|
|
|
|
|
return response;
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
stopWatch.Stop();
|
|
|
|
|
|
sysLogHttp.EndTime = DateTime.Now;
|
|
|
|
|
|
sysLogHttp.IsSuccessStatusCode = YesNoEnum.N;
|
|
|
|
|
|
sysLogHttp.Exception = JSON.Serialize(SerializableException.FromException(ex));
|
|
|
|
|
|
throw;
|
|
|
|
|
|
}
|
|
|
|
|
|
finally
|
|
|
|
|
|
{
|
|
|
|
|
|
sysLogHttp.Elapsed = stopWatch.ElapsedMilliseconds;
|
2025-08-30 14:10:38 +08:00
|
|
|
|
await _eventPublisher.PublishAsync(nameof(AppEventSubscriber.CreateHttpLog), sysLogHttp, cancellationToken);
|
2025-08-20 09:10:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|