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);