A:增加全局JSON配置,并增加统一的序列化和反序列化

This commit is contained in:
jimmy committed 2025-07-01 14:02:45 +08:00
1 parent 879dd0fc34
commit 96e60137b2
7 files changed
+141 -24

No files matched your search

@@ -4,6 +4,7 @@ using System.Text.Json.Serialization;
using Common;
using Common.Logger;
using Common.Net.WebSocketConn;
using Common.Utils;
using Infrastructure.Models;
using Utils.ETW.Etw;
@@ -17,7 +18,8 @@ public class DispatchEngine
private DispatchEngine()
{
}
// region 软件信息订阅
#region 软件信息订阅
/// <summary>
/// 软件信息订阅
@@ -134,7 +136,7 @@ public class DispatchEngine
appInfoList.Add(pi);
}
var serialize = JsonSerializer.Serialize(appInfoList);
var serialize = JsonHelper.ToJson(appInfoList);
foreach (var keyValuePair in ApplicationInfoDispatch)
{
@@ -176,7 +178,94 @@ public class DispatchEngine
}, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
}
// endregion
#endregion
#region 线程信息订阅
/// <summary>
/// 线程信息订阅
/// </summary>
private ConcurrentDictionary<string, ProcessDispatchModel> ProcessInfoDispatch = [];
/// <summary>
/// 软件信息上次发送时间
/// </summary>
private ConcurrentDictionary<string, DateTime> ProcessInfoLastSendTime = [];
/// <summary>
/// 添加订阅
/// </summary>
public void AddProcessInfo(string clientId, ProcessDispatchModel model)
{
ProcessInfoDispatch.TryAdd(clientId, model);
}
/// <summary>
/// 更新订阅
/// </summary>
public void UpdateProcessInfo(string clientId, ProcessDispatchModel model)
{
ProcessInfoDispatch[clientId] = model;
}
/// <summary>
/// 删除订阅
/// </summary>
public void DeleteProcessInfo(string clientId)
{
ProcessInfoDispatch.TryRemove(clientId, out _);
}
// 添加这个字段来保持Timer的强引用;Timer 对象没有强引用,会被垃圾回收器回收。
private Timer _processInfoTimer;
/// <summary>
/// 需要监视的线程列表
/// </summary>
public List<int> MonitorProcessList = new List<int>();
/// <summary>
/// 软件信息分发
/// </summary>
public void ProcessInfoDistribute()
{
_processInfoTimer = new Timer(state =>
{
if (ProcessInfoDispatch.Count == 0)
{
return;
}
// 获取信息
foreach (var processDispatchModel in ProcessInfoDispatch)
{
// 获取所有信息
var connectionInfos =
GlobalNetworkMonitor.Instance.GetAllConnection(processDispatchModel.Value.ProcessIds);
// 上行总数据
long allBytesSent = 0;
// 下行总数据
long allBytesReceived = 0;
// 上行网速总数据
double allSendSpeed = 0;
// 下行网速总数据
double allReceiveSpeed = 0;
foreach (var connectionInfo in connectionInfos)
{
// 数据发送量
allBytesSent += connectionInfo.BytesSent;
allBytesReceived += connectionInfo.BytesReceived;
// 网速数据
allSendSpeed += connectionInfo.CurrentSendSpeed;
allReceiveSpeed += connectionInfo.CurrentReceiveSpeed;
}
}
}, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
}
#endregion
}
/// <summary>
@@ -190,11 +279,20 @@ public class DispatchModel
public int Interval { get; set; }
}
/// <summary>
/// 进程订阅模型
/// </summary>
public class ProcessDispatchModel : DispatchModel
{
// 订阅的进程列表
public List<int> ProcessIds { get; set; }
}
/// <summary>
/// 订阅信息内容
/// </summary>
public class SubscriptionInfo
{
[JsonPropertyName("subscriptionType")] public string SubscriptionType { get; set; }
[JsonPropertyName("interval")] public int Interval { get; set; }
public string SubscriptionType { get; set; }
public int Interval { get; set; }
}
@@ -3,6 +3,7 @@ using System.Net;
using System.Text;
using System.Text.Json;
using System.Web;
using Common.Utils;
using Fleck;
namespace Common.Net.HttpConn;
@@ -34,7 +35,7 @@ public class HttpContext
public Dictionary<string, string> RouteParams { get; set; } = new Dictionary<string, string>();
public NameValueCollection QueryParams { get; set; }
public string RequestBody { get; set; }
public T GetRequestBody<T>() => JsonSerializer.Deserialize<T>(RequestBody);
public T GetRequestBody<T>() => JsonHelper.FromJson<T>(RequestBody);
}
// 路由信息
@@ -284,11 +285,8 @@ public static class HttpListenerResponseExtensions
public static async Task WriteJsonAsync<T>(this HttpListenerResponse response, T data)
{
response.ContentType = "application/json; charset=utf-8";
var json = JsonSerializer.Serialize(data, new JsonSerializerOptions
{
WriteIndented = true,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
var json = JsonHelper.ToJson(data);
var buffer = Encoding.UTF8.GetBytes(json);
response.ContentLength64 = buffer.Length;
await response.OutputStream.WriteAsync(buffer, 0, buffer.Length);
@@ -5,8 +5,8 @@ namespace Common.Net.WebSocketConn;
// 消息基类
public abstract class BaseMessage
{
[JsonPropertyName("messageId")] public string? MessageId { get; set; } = Guid.NewGuid().ToString();
[JsonPropertyName("timestamp")] public DateTime Timestamp { get; set; } = DateTime.Now;
public string? MessageId { get; set; } = Guid.NewGuid().ToString();
public DateTime Timestamp { get; set; } = DateTime.Now;
}
// 网络状态消息
@@ -32,15 +32,14 @@ public class FirewallRuleMessage : NotificationMessage
// 命令消息
public class CommandMessage : BaseMessage
{
[JsonPropertyName("command")] public string Command { get; set; }
[JsonPropertyName("data")] public object Data { get; set; }
public string Command { get; set; }
public object Data { get; set; }
}
// 响应消息
public class ResponseMessage : NotificationMessage
{
[JsonPropertyName("success")] public bool Success { get; set; }
public bool Success { get; set; }
}
/// <summary>
@@ -48,7 +47,7 @@ public class ResponseMessage : NotificationMessage
/// </summary>
public class NotificationMessage : BaseMessage
{
[JsonPropertyName("type")] public string Type { get; set; } // 通知类型,如 "networkStatusUpdate", "firewallRuleChanged"
[JsonPropertyName("data")] public object Data { get; set; }
[JsonPropertyName("message")] public string Message { get; set; }
}
public string Type { get; set; } // 通知类型,如 "networkStatusUpdate", "firewallRuleChanged"
public object Data { get; set; }
public string Message { get; set; }
}
@@ -3,6 +3,7 @@ using System.Net.WebSockets;
using System.Text.Json;
using System.Web;
using Common.Logger;
using Common.Utils;
using Fleck;
namespace Common.Net.WebSocketConn;
@@ -270,7 +271,7 @@ public class WebSocketManager
try
{
Console.WriteLine(DateTime.Now);
var commandMessage = JsonSerializer.Deserialize<CommandMessage>(message);
var commandMessage = JsonHelper.FromJson<CommandMessage>(message);
if (commandMessage != null && !string.IsNullOrEmpty(commandMessage.Command))
{
await ProcessCommand(commandMessage, socket);
@@ -326,7 +327,7 @@ public class WebSocketManager
{
try
{
var json = JsonSerializer.Serialize(message);
var json = JsonHelper.ToJson(message);
await socket.Socket.Send(json);
return true;
}
@@ -364,7 +365,7 @@ public class WebSocketManager
/// </summary>
public async Task BroadcastMessage(ResponseMessage message)
{
var json = JsonSerializer.Serialize(message);
var json = JsonHelper.ToJson(message);
var tasks = new List<Task>();
foreach (var connection in _connections.Values)
+1
View File
@@ -36,4 +36,5 @@ public sealed class AppConfig
/// 订阅字符串
/// </summary>
public static readonly string ApplicationInfoSubscribe= "ApplicationInfo";
public static readonly string ProcessInfoSubscribe= "ProcessInfo";
}
@@ -0,0 +1,18 @@
using System.Text.Json;
namespace Common.Utils;
public static class JsonHelper
{
public static readonly JsonSerializerOptions CamelCaseOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
public static string ToJson<T>(T value) =>
JsonSerializer.Serialize(value, CamelCaseOptions);
public static T? FromJson<T>(string json) =>
JsonSerializer.Deserialize<T>(json, CamelCaseOptions);
}
@@ -20,6 +20,7 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIcon_002Ecs_002Fl_003AC_0021_003FUsers_003Fcharlatans_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F946b37ae1f1648b7a334a81e4b6ce11c64330_003F21_003F67e31def_003FIcon_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIDisposable_002Ecs_002Fl_003AC_0021_003FUsers_003Fyllyo_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F5aeb6167299d4cfba30c86624130edbcc90938_003F41_003F0f283a8f_003FIDisposable_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIPAddress_002Ecs_002Fl_003AC_0021_003FUsers_003Fcharlatans_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F5dc54dc133694e6ca1812e5e56e958df388a0_003F68_003F0bc1a452_003FIPAddress_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIPEndPoint_002Ecs_002Fl_003AC_0021_003FUsers_003Fyllyo_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fdc231f7ab11c4da0b27a11c2ad4b9b4038938_003F06_003Fc689d816_003FIPEndPoint_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIWebSocketConnectionInfo_002Ecs_002Fl_003AC_0021_003FUsers_003Fyllyo_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa7d96aff8e344c1d9aa8042f229d493cae00_003F54_003Ff0e67f89_003FIWebSocketConnectionInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIWebSocketConnection_002Ecs_002Fl_003AC_0021_003FUsers_003Fcharlatans_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa7d96aff8e344c1d9aa8042f229d493cae00_003Fc1_003Fb154f2eb_003FIWebSocketConnection_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIWebSocketConnection_002Ecs_002Fl_003AC_0021_003FUsers_003Fyllyo_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa7d96aff8e344c1d9aa8042f229d493cae00_003Fc1_003Fb154f2eb_003FIWebSocketConnection_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
@@ -31,6 +32,7 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANetworkInterface_002Ecs_002Fl_003AC_0021_003FUsers_003Fcharlatans_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F9c72a65889eb40ae9d8e0f130d1572e0268a0_003F34_003F49f5e6ff_003FNetworkInterface_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AProcessModule_002Ecs_002Fl_003AC_0021_003FUsers_003Fyllyo_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa70eaad10e4f42d4a1f24ff3865c6c6252928_003Fec_003F0881d57a_003FProcessModule_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AProcess_002Ecs_002Fl_003AC_0021_003FUsers_003Fcharlatans_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F4a26a752ec6249c4a090905d31c0cdfa528a0_003F8f_003F7037e590_003FProcess_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AProcess_002Ecs_002Fl_003AC_0021_003FUsers_003Fyllyo_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa70eaad10e4f42d4a1f24ff3865c6c6252928_003F1e_003Fd0b0af48_003FProcess_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AQueue_00601_002Ecs_002Fl_003AC_0021_003FUsers_003Fcharlatans_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F211e6f3b24fa438a92f1815153647ce2c8f908_003Fa1_003F352e385c_003FQueue_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AQueue_00601_002Ecs_002Fl_003AC_0021_003FUsers_003Fyllyo_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F5aeb6167299d4cfba30c86624130edbcc90938_003F2b_003Fb4ef3890_003FQueue_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AReaderWriterLockSlim_002Ecs_002Fl_003AC_0021_003FUsers_003Fcharlatans_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F211e6f3b24fa438a92f1815153647ce2c8f908_003Fb5_003Fa78f431c_003FReaderWriterLockSlim_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>