102 lines
3.5 KiB
C#
102 lines
3.5 KiB
C#
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text.Encodings.Web;
|
|
using System.Text.Json;
|
|
using System.Threading.Tasks;
|
|
using WebView2Demo.Models;
|
|
|
|
namespace WebView2Demo.WebInterop
|
|
{
|
|
/// <summary>
|
|
/// 前后端互操作主网关类 [反射分发, 统一回包]
|
|
/// </summary>
|
|
[ClassInterface(ClassInterfaceType.None)]
|
|
[ComVisible(true)]
|
|
public class MainSystemGateway
|
|
{
|
|
private readonly ApiRouteManager _routeManager;
|
|
private readonly JsonSerializerOptions _jsonOptions = new()
|
|
{
|
|
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
|
|
PropertyNameCaseInsensitive = true,
|
|
WriteIndented = false
|
|
};
|
|
|
|
public MainSystemGateway()
|
|
{
|
|
// 初始化路由管理器
|
|
_routeManager = new ApiRouteManager(_jsonOptions);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 统一 API 调用入口 (前端唯一调用的方法)
|
|
/// 遵循 COM 规范,接收 string 并返回 string
|
|
/// </summary>
|
|
public async Task<string> InvokeAction(string requestJson)
|
|
{
|
|
// 这里我们调用内部泛型处理逻辑,T 使用 JsonElement 作为通用基类
|
|
return await ProcessRequestInternal<JsonElement>(requestJson);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 内部泛型处理逻辑:在这里进行真正的协议解析和分发
|
|
/// </summary>
|
|
/// <typeparam name="T">请求数据的泛型类型</typeparam>
|
|
private async Task<string> ProcessRequestInternal<T>(string requestJson)
|
|
{
|
|
try
|
|
{
|
|
// 1. 解析请求信封 (进入泛型世界)
|
|
var request = JsonSerializer.Deserialize<StandardApiRequest<T>>(requestJson, _jsonOptions);
|
|
if (request == null || string.IsNullOrWhiteSpace(request.Action))
|
|
{
|
|
return MakeErrorResponse("请求 JSON 格式错误或 Action 缺失");
|
|
}
|
|
|
|
// 2. 路由分发 (通过反射查找 Service 和 Method 并执行)
|
|
// 注意:由于 ApiRouteManager 内部处理了 JsonElement 的动态解析,这里我们传入 Data 即可
|
|
JsonElement rawData = request.Data is JsonElement element ? element : default;
|
|
var (data, msg) = await _routeManager.DispatchActionAsync(request.Action, rawData);
|
|
|
|
// 3. 根据结果统一回包
|
|
if (data == null && msg.Contains("未找到"))
|
|
{
|
|
return MakeErrorResponse(msg);
|
|
}
|
|
|
|
return MakeSuccessResponse(data!, msg);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return MakeErrorResponse($"网关内部崩溃: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
#region [ 响应封装辅助 ]
|
|
|
|
private string MakeSuccessResponse(object data, string msg = "操作成功")
|
|
{
|
|
var response = new StandardApiResponse
|
|
{
|
|
Success = true,
|
|
Message = msg,
|
|
Data = data
|
|
};
|
|
return JsonSerializer.Serialize(response, _jsonOptions);
|
|
}
|
|
|
|
private string MakeErrorResponse(string msg)
|
|
{
|
|
var response = new StandardApiResponse
|
|
{
|
|
Success = false,
|
|
Message = msg,
|
|
Data = null
|
|
};
|
|
return JsonSerializer.Serialize(response, _jsonOptions);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|