Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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)
                });
            }
        }
Exemple #3
0
        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)
                });
            }
        }