From 445bfe8273625d86ce1017d5777c72de18ccefe7 Mon Sep 17 00:00:00 2001 From: "HOME-LAPTOP\\kshkulev" Date: Mon, 27 Oct 2025 10:44:42 +0900 Subject: [PATCH] Add request start without waiting for result --- Hcs.Broker/Api/NsiCommonApi.cs | 5 +- .../Request/NsiCommon/ExportNsiItemRequest.cs | 18 ++++++ Hcs.Broker/Api/Request/RequestBase.cs | 56 +++++++++++++++++++ 3 files changed, 77 insertions(+), 2 deletions(-) diff --git a/Hcs.Broker/Api/NsiCommonApi.cs b/Hcs.Broker/Api/NsiCommonApi.cs index c93afd5..5579bae 100644 --- a/Hcs.Broker/Api/NsiCommonApi.cs +++ b/Hcs.Broker/Api/NsiCommonApi.cs @@ -36,9 +36,10 @@ namespace Hcs.Broker.Api } /// - public Task RequestExportNsiItemAsync(int registryNumber, ListGroup listGroup, CancellationToken token = default) + public async Task RequestExportNsiItemAsync(int registryNumber, ListGroup listGroup, CancellationToken token = default) { - throw new NotImplementedException(); + var request = new ExportNsiItemRequest(client); + return await request.SendAsync(registryNumber, listGroup, token); } } } diff --git a/Hcs.Broker/Api/Request/NsiCommon/ExportNsiItemRequest.cs b/Hcs.Broker/Api/Request/NsiCommon/ExportNsiItemRequest.cs index 4cf5729..8c175b6 100644 --- a/Hcs.Broker/Api/Request/NsiCommon/ExportNsiItemRequest.cs +++ b/Hcs.Broker/Api/Request/NsiCommon/ExportNsiItemRequest.cs @@ -24,5 +24,23 @@ namespace Hcs.Broker.Api.Request.NsiCommon return result.Item as NsiItemType; } + + internal async Task SendAsync(int registryNumber, ListGroup listGroup, CancellationToken token) + { + // http://open-gkh.ru/NsiCommon/exportNsiItemRequest.html + var request = new exportNsiItemRequest + { + Id = Constants.SIGNED_XML_ELEMENT_ID, + version = "10.0.1.2", + RegistryNumber = registryNumber.ToString(), + ListGroup = listGroup + }; + + return await StartSendAsync(request, async asyncClient => + { + var response = await asyncClient.exportNsiItemAsync(CreateRequestHeader(), request); + return response.AckRequest.Ack; + }, token); + } } } diff --git a/Hcs.Broker/Api/Request/RequestBase.cs b/Hcs.Broker/Api/Request/RequestBase.cs index 98c0c51..6dbeae9 100644 --- a/Hcs.Broker/Api/Request/RequestBase.cs +++ b/Hcs.Broker/Api/Request/RequestBase.cs @@ -149,6 +149,39 @@ namespace Hcs.Broker.Api.Request } } + protected async Task StartSendAsync( + object request, + Func> sender, + CancellationToken token) + { + token.ThrowIfCancellationRequested(); + + while (true) + { + try + { + if (CanBeRestarted) + { + return await RunRepeatableTaskInsistentlyAsync( + async () => await ExecuteSendAsync(request, sender), token); + } + else + { + return await ExecuteSendAsync(request, sender); + } + } + catch (RestartTimeoutException e) + { + if (!CanBeRestarted) + { + throw new System.Exception("Cannot restart request execution on timeout", e); + } + + client.TryLog($"Restarting {request.GetType().Name} request execution..."); + } + } + } + /// /// Для запросов к серверу которые можно направлять несколько раз, разрешаем /// серверу аномально отказаться. Предполагается, что здесь мы игнорируем @@ -251,6 +284,29 @@ namespace Hcs.Broker.Api.Request return result; } + private async Task ExecuteSendAsync( + object request, + Func> sender) + { + ArgumentNullException.ThrowIfNull(request); + + var version = RequestHelper.GetRequestVersionString(request); + client.TryLog($"Executing request {RemoteAddress.Uri}/{request.GetType().Name} of version {version}..."); + + TAck ack; + + var stopWatch = System.Diagnostics.Stopwatch.StartNew(); + using (var asyncClient = CreateAsyncClient()) + { + ack = await sender(asyncClient); + } + stopWatch.Stop(); + + client.TryLog($"Request executed in {stopWatch.ElapsedMilliseconds} ms, result GUID is {ack.MessageGUID}"); + + return ack.MessageGUID; + } + private TAsyncClient CreateAsyncClient() { var asyncClient = (TAsyncClient)Activator.CreateInstance(typeof(TAsyncClient), binding, RemoteAddress);