/// <summary> /// Вызвать внешний сервис, определенный через Js /// </summary> /// <param name="remoteName"></param> /// <param name="workerName"></param> /// <param name="methodName"></param> /// <param name="methodParams"></param> /// <returns></returns> public async Task <string> CallRemoteWorkerMethod(string remoteName, string workerName, string methodName, params dynamic[] methodParams) { if (!RemoteDocs.ContainsKey(remoteName)) { throw WriteLogAndGetException(new JsExecutionLog { EventIdName = EventIds.CallRemoteApi.RemoteApiNotFound, Message = $"В системе нет зарегистрированного внешнего апи с именем '{remoteName}'", DataJson = null }); } var remoteApi = RemoteDocs[remoteName]; var worker = remoteApi.Docs.Workers.FirstOrDefault(x => x.WorkerName == workerName); if (worker == null) { throw WriteLogAndGetException(new JsExecutionLog { EventIdName = EventIds.CallRemoteApi.NoWorkerWithNameFound, Message = $"Во внешнем апи '{remoteName}' не зарегистрирован рабочий класс с именем '{workerName}'", DataJson = null }); } var method = worker.Methods.FirstOrDefault(x => x.MethodName == methodName); if (method == null) { throw new InvalidOperationException($"Во внешнем апи '{remoteName}' в рабочем классе с именем '{workerName}' не обнаружен метож '{methodName}'"); } var requestModel = new CallOpenApiWorkerMethod { WorkerName = workerName, MethodName = methodName, SerializedParameters = methodParams?.Select(ZooSerializer.Serialize).ToArray() ?? Array.Empty <string>() }; var callResult = await CallResult(remoteApi, requestModel); if (!callResult.IsSucceeded) { throw WriteLogAndGetException(new JsExecutionLog { EventIdName = EventIds.CallRemoteApi.CallNotSucceeded, Message = "Ошибка при выполнении удалленного запроса", DataJson = ZooSerializer.Serialize(callResult) }); } return(callResult.ResponseJson); }
/// <summary> /// Вызвать метод рабочего класса. /// <para></para> /// Данный метод не возвращает исключений. Его нужно испльзовать как внешюю точку доступа. /// </summary> /// <param name="requestModel"></param> /// <returns></returns> public CallOpenApiWorkerMethodResponse CallWorkerMethod(CallOpenApiWorkerMethod requestModel) { if (requestModel == null) { return(new CallOpenApiWorkerMethodResponse { IsSucceeded = false, ExcepionData = ExcepionData.Create(new Exception("request is null onjcet")) }); } var parameters = new JsWorkerMethodCallParametersFromSerialized(requestModel.SerializedParameters); try { var jsContext = GetContext(); using var scope = ServiceProvider.CreateScope(); var result = Components .GetJsWorker(requestModel.WorkerName, jsContext) .HandleCall(requestModel.MethodName, scope.ServiceProvider, parameters, jsContext, Logger); return(new CallOpenApiWorkerMethodResponse { IsSucceeded = true, ResponseJson = ZooSerializer.Serialize(result.Result) }); } catch (Exception ex) { Logger.LogError(ex, "CallWorkerMethod.Error"); return(new CallOpenApiWorkerMethodResponse { IsSucceeded = false, ExcepionData = ExcepionData.Create(ex) }); } }
private async Task <CallOpenApiWorkerMethodResponse> CallResult(RemoteJsOpenApiDocs remoteApi, CallOpenApiWorkerMethod requestModel) { var responseRecord = await HttpClient.PostAsync(remoteApi.Description.HostUrl, remoteApi.Description.Name, HttpPaths.HandleCall, requestModel); ExecutionContext.ExecutionLogs.Add(new JsExecutionLog { EventIdName = EventIds.CallRemoteApi.CallLogged, Message = "Логгирование удаленного запроса", DataJson = ZooSerializer.Serialize(responseRecord) }); try { //Task<RemoteApiResponseRecord> PostAsync<TRequest>(string hostUrl, string hostName, string path, TRequest request) return(responseRecord.GetResult <CallOpenApiWorkerMethodResponse>()); } catch (Exception ex) { ExecutionContext.ExecutionLogs.Add(new JsExecutionLog { EventIdName = EventIds.CallRemoteApi.ResponseDeserializationError, Message = "Ошибка при дессериализации", DataJson = ZooSerializer.Serialize(responseRecord) }); return(new CallOpenApiWorkerMethodResponse { IsSucceeded = false, ExcepionData = ExcepionData.Create(ex) }); } }