using System.Net; using System.Text.Json; using System.Text.RegularExpressions; using XFEExtension.NetCore.AutoImplement; using XFEExtension.NetCore.DelegateExtension; using XFEExtension.NetCore.ServerInteractive.Exceptions; using XFEExtension.NetCore.ServerInteractive.Interfaces.Requester; using XFEExtension.NetCore.ServerInteractive.Models.RequesterModels; using XFEExtension.NetCore.ServerInteractive.Utilities.Helpers; using XFEExtension.NetCore.ServerInteractive.Utilities.JsonConverter; namespace XFEExtension.NetCore.ServerInteractive.Utilities.Requester; /// /// XFE客户端请求器 /// [CreateImpl] public abstract class XFEClientRequester : IRequesterBase { private readonly JsonSerializerOptions _jsonSerializerOptions = new(); internal Dictionary> RequestServiceDictionary = []; internal Dictionary> StandardRequestServiceDictionary = []; internal Dictionary StandardClientInstanceRequestDictionary = []; /// public string RequestAddress { get; set; } = string.Empty; /// public string Session { get; set; } = string.Empty; /// public string DeviceInfo { get; set; } = string.Empty; /// public event XFEEventHandler? MessageReceived; /// /// XFE客户端请求器 /// protected XFEClientRequester() { _jsonSerializerOptions.Converters.Add(new JsonDateTimeConverter()); } /// /// 请求 /// /// /// /// /// /// public async Task> Request(string serviceName, params object[] parameters) => (await Request(serviceName, parameters)).TryConvertTo(); /// /// 请求 /// /// /// /// /// public async Task> Request(string serviceName, params object[] parameters) { var result = new ClientRequestResult(); try { if (RequestServiceDictionary.TryGetValue(serviceName, out var serviceFactory)) { var service = serviceFactory(); service.XFEClientRequester = this; result = await service.Request(parameters); } else if (StandardRequestServiceDictionary.TryGetValue(serviceName, out var xFEServiceFactory)) { var xFEService = xFEServiceFactory(); xFEService.XFEClientRequester = this; xFEService.DeviceInfo = DeviceInfo; xFEService.Parameters = parameters; // 通过RequestRouteMap解析实际路由路径 var actualRoute = xFEService.RequestRouteMap.GetValueOrDefault(serviceName, serviceName); xFEService.Route = actualRoute; if (!xFEService.RequestPoints.TryGetValue(serviceName, out var requestHandler)) throw new XFERequesterException($"未找到'{serviceName}'对应的请求处理方法([Request]标记的方法)"); var (response, code) = await InteractiveHelper.GetServerResponse(RequestAddress + $"/{actualRoute}", requestHandler(), _jsonSerializerOptions); result.StatusCode = code; if (code == HttpStatusCode.OK) { xFEService.Response = response; xFEService.UnescapedResponse = Regex.Unescape(response); if (xFEService.ResponsePoints.TryGetValue(serviceName, out var responseHandler)) { result.Result = responseHandler(); } else { result.Result = response; } MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl("Success", code)); result.Message = "Success"; } else { MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl(response, code)); result.Message = response; } } else if (StandardClientInstanceRequestDictionary.TryGetValue(serviceName, out var instance)) { var (response, code) = await InteractiveHelper.GetServerResponse(RequestAddress + $"/{serviceName}", instance.ConstructBody(Session, DeviceInfo, parameters), _jsonSerializerOptions); result.StatusCode = code; if (code == HttpStatusCode.OK) { var requestResult = instance.ProcessResponse?.Invoke(response); MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl("Success", code)); result.Message = "Success"; result.Result = requestResult ?? new(); } else { MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl(response, code)); result.Message = response; } } return result; } catch (Exception ex) { MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl(ex.Message, HttpStatusCode.InternalServerError)); result.Message = ex.Message; result.StatusCode = HttpStatusCode.InternalServerError; return result; } } }