A:增加全局JSON配置,并增加统一的序列化和反序列化
This commit is contained in:
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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in new issue
Block a user