Add export from nsi-common service
This commit is contained in:
@ -9,7 +9,7 @@ using DebtRequests = Hcs.Service.Async.DebtRequests.v15_7_0_1;
|
||||
namespace Hcs.Service.Async.DebtRequests.v15_7_0_1
|
||||
{
|
||||
public partial class AckRequestAck : IHcsAck { }
|
||||
public partial class getStateResult : IHcsGetStateResult { }
|
||||
public partial class getStateResult : IHcsGetStateResultMany { }
|
||||
public partial class Fault : IHcsFault { }
|
||||
public partial class HeaderType : IHcsHeaderType { }
|
||||
}
|
||||
@ -18,7 +18,7 @@ namespace Hcs.ClientApi.DebtRequestsApi
|
||||
{
|
||||
/// Метод для отправки запросов к сервису запросов о наличии задолженности
|
||||
/// Описание: http://open-gkh.ru/DebtRequestsServiceAsync/
|
||||
public class HcsDebtRequestsMethod : HcsRemoteCallMethod
|
||||
public class HcsDebtRequestsMethod : HcsRemoteCallMethod<IHcsGetStateResultMany>
|
||||
{
|
||||
public HcsEndPoints EndPoint => HcsEndPoints.DebtRequestsAsync;
|
||||
|
||||
@ -88,14 +88,14 @@ namespace Hcs.ClientApi.DebtRequestsApi
|
||||
/// Выполняет однократную проверку наличия результата.
|
||||
/// Возвращает null если результата еще нет.
|
||||
/// </summary>
|
||||
protected override async Task<IHcsGetStateResult> TryGetResultAsync(
|
||||
protected override async Task<IHcsGetStateResultMany> TryGetResultAsync(
|
||||
IHcsAck sourceAck, CancellationToken token = default)
|
||||
{
|
||||
Func<Task<IHcsGetStateResult>> func = async () => await TryGetResultBareAsync(sourceAck);
|
||||
Func<Task<IHcsGetStateResultMany>> func = async () => await TryGetResultBareAsync(sourceAck);
|
||||
return await RunRepeatableTaskInsistentlyAsync(func, token);
|
||||
}
|
||||
|
||||
private async Task<IHcsGetStateResult> TryGetResultBareAsync(IHcsAck sourceAck)
|
||||
private async Task<IHcsGetStateResultMany> TryGetResultBareAsync(IHcsAck sourceAck)
|
||||
{
|
||||
using (var client = NewPortClient())
|
||||
{
|
||||
@ -115,7 +115,7 @@ namespace Hcs.ClientApi.DebtRequestsApi
|
||||
}
|
||||
}
|
||||
|
||||
private void CheckResultForErrors(IHcsGetStateResult result)
|
||||
private void CheckResultForErrors(IHcsGetStateResultMany result)
|
||||
{
|
||||
if (result == null) throw new HcsException("Пустой result");
|
||||
|
||||
|
||||
@ -135,7 +135,7 @@ namespace Hcs.ClientApi.DebtRequestsApi
|
||||
}
|
||||
}
|
||||
|
||||
private DSRsBatch ParseExportResultBatch(RemoteCaller.IHcsGetStateResult result)
|
||||
private DSRsBatch ParseExportResultBatch(RemoteCaller.IHcsGetStateResultMany result)
|
||||
{
|
||||
var batch = new DSRsBatch();
|
||||
|
||||
|
||||
@ -9,14 +9,14 @@ using DeviceMetering = Hcs.Service.Async.DeviceMetering.v15_7_0_1;
|
||||
namespace Hcs.Service.Async.DeviceMetering.v15_7_0_1
|
||||
{
|
||||
public partial class AckRequestAck : IHcsAck { }
|
||||
public partial class getStateResult : IHcsGetStateResult { }
|
||||
public partial class getStateResult : IHcsGetStateResultMany { }
|
||||
public partial class Fault : IHcsFault { }
|
||||
public partial class HeaderType : IHcsHeaderType { }
|
||||
}
|
||||
|
||||
namespace Hcs.ClientApi.DeviceMeteringApi
|
||||
{
|
||||
public class HcsDeviceMeteringMethod : HcsRemoteCallMethod
|
||||
public class HcsDeviceMeteringMethod : HcsRemoteCallMethod<IHcsGetStateResultMany>
|
||||
{
|
||||
public HcsEndPoints EndPoint => HcsEndPoints.DeviceMeteringAsync;
|
||||
|
||||
@ -35,7 +35,7 @@ namespace Hcs.ClientApi.DeviceMeteringApi
|
||||
return client;
|
||||
}
|
||||
|
||||
public async Task<IHcsGetStateResult> SendAndWaitResultAsync(
|
||||
public async Task<IHcsGetStateResultMany> SendAndWaitResultAsync(
|
||||
object request,
|
||||
Func<DeviceMetering.DeviceMeteringPortTypesAsyncClient, Task<IHcsAck>> sender,
|
||||
CancellationToken token)
|
||||
@ -62,7 +62,7 @@ namespace Hcs.ClientApi.DeviceMeteringApi
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<IHcsGetStateResult> SendAndWaitResultAsyncImpl(
|
||||
private async Task<IHcsGetStateResultMany> SendAndWaitResultAsyncImpl(
|
||||
object request,
|
||||
Func<DeviceMetering.DeviceMeteringPortTypesAsyncClient, Task<IHcsAck>> sender,
|
||||
CancellationToken token)
|
||||
@ -96,7 +96,7 @@ namespace Hcs.ClientApi.DeviceMeteringApi
|
||||
/// Выполняет однократную проверку наличия результата.
|
||||
/// Возвращает null если результата еще нет.
|
||||
/// </summary>
|
||||
protected override async Task<IHcsGetStateResult> TryGetResultAsync(IHcsAck sourceAck, CancellationToken token)
|
||||
protected override async Task<IHcsGetStateResultMany> TryGetResultAsync(IHcsAck sourceAck, CancellationToken token)
|
||||
{
|
||||
using (var client = NewPortClient())
|
||||
{
|
||||
|
||||
@ -4,6 +4,7 @@ using Hcs.ClientApi.DeviceMeteringApi;
|
||||
using Hcs.ClientApi.FileStoreServiceApi;
|
||||
using Hcs.ClientApi.HouseManagementApi;
|
||||
using Hcs.ClientApi.NsiApi;
|
||||
using Hcs.ClientApi.NsiCommonApi;
|
||||
using Hcs.ClientApi.OrgRegistryCommonApi;
|
||||
using Hcs.ClientApi.RemoteCaller;
|
||||
using System;
|
||||
@ -42,6 +43,7 @@ namespace Hcs.ClientApi
|
||||
public HcsFileStoreServiceApi FileStoreService => new HcsFileStoreServiceApi(this);
|
||||
public HcsDeviceMeteringApi DeviceMeteringService => new HcsDeviceMeteringApi(this);
|
||||
public HcsNsiApi Nsi => new HcsNsiApi(this);
|
||||
public HcsNsiCommonApi NsiCommon => new HcsNsiCommonApi(this);
|
||||
|
||||
public X509Certificate2 FindCertificate(Func<X509Certificate2, bool> predicate)
|
||||
{
|
||||
|
||||
@ -9,14 +9,14 @@ using HouseManagement = Hcs.Service.Async.HouseManagement.v15_7_0_1;
|
||||
namespace Hcs.Service.Async.HouseManagement.v15_7_0_1
|
||||
{
|
||||
public partial class AckRequestAck : IHcsAck { }
|
||||
public partial class getStateResult : IHcsGetStateResult { }
|
||||
public partial class getStateResult : IHcsGetStateResultMany { }
|
||||
public partial class Fault : IHcsFault { }
|
||||
public partial class HeaderType : IHcsHeaderType { }
|
||||
}
|
||||
|
||||
namespace Hcs.ClientApi.HouseManagementApi
|
||||
{
|
||||
public class HcsHouseManagementMethod : HcsRemoteCallMethod
|
||||
public class HcsHouseManagementMethod : HcsRemoteCallMethod<IHcsGetStateResultMany>
|
||||
{
|
||||
public HcsEndPoints EndPoint => HcsEndPoints.HomeManagementAsync;
|
||||
|
||||
@ -35,7 +35,7 @@ namespace Hcs.ClientApi.HouseManagementApi
|
||||
return client;
|
||||
}
|
||||
|
||||
public async Task<IHcsGetStateResult> SendAndWaitResultAsync(
|
||||
public async Task<IHcsGetStateResultMany> SendAndWaitResultAsync(
|
||||
object request,
|
||||
Func<HouseManagement.HouseManagementPortsTypeAsyncClient, Task<IHcsAck>> sender,
|
||||
CancellationToken token)
|
||||
@ -64,7 +64,7 @@ namespace Hcs.ClientApi.HouseManagementApi
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<IHcsGetStateResult> SendAndWaitResultAsyncImpl(
|
||||
private async Task<IHcsGetStateResultMany> SendAndWaitResultAsyncImpl(
|
||||
object request,
|
||||
Func<HouseManagement.HouseManagementPortsTypeAsyncClient, Task<IHcsAck>> sender,
|
||||
CancellationToken token)
|
||||
@ -98,7 +98,7 @@ namespace Hcs.ClientApi.HouseManagementApi
|
||||
/// Выполняет однократную проверку наличия результата.
|
||||
/// Возвращает null если результата еще нет.
|
||||
/// </summary>
|
||||
protected override async Task<IHcsGetStateResult> TryGetResultAsync(IHcsAck sourceAck, CancellationToken token)
|
||||
protected override async Task<IHcsGetStateResultMany> TryGetResultAsync(IHcsAck sourceAck, CancellationToken token)
|
||||
{
|
||||
using (var client = NewPortClient())
|
||||
{
|
||||
@ -120,7 +120,7 @@ namespace Hcs.ClientApi.HouseManagementApi
|
||||
/// <summary>
|
||||
/// Разбирает стандартный ответ HCS на операцию импорта с приемом ошибок
|
||||
/// </summary>
|
||||
protected HouseManagement.getStateResultImportResultCommonResult ParseSingleImportResult(IHcsGetStateResult stateResult)
|
||||
protected HouseManagement.getStateResultImportResultCommonResult ParseSingleImportResult(IHcsGetStateResultMany stateResult)
|
||||
{
|
||||
return ParseImportResults(stateResult, 1, true).First();
|
||||
}
|
||||
@ -129,7 +129,7 @@ namespace Hcs.ClientApi.HouseManagementApi
|
||||
/// Разбирает стандартный ответ HCS на операцию импорта с приемом ошибок
|
||||
/// </summary>
|
||||
protected HouseManagement.getStateResultImportResultCommonResult[] ParseImportResults(
|
||||
IHcsGetStateResult stateResult, int commonResultRequiredCount, bool checkItemErrors)
|
||||
IHcsGetStateResultMany stateResult, int commonResultRequiredCount, bool checkItemErrors)
|
||||
{
|
||||
var importResult = RequireSingleItem<HouseManagement.getStateResultImportResult>(stateResult.Items);
|
||||
if (IsArrayEmpty(importResult.Items)) throw new HcsException("Пустой ImportResult.Items");
|
||||
|
||||
@ -9,14 +9,14 @@ using Nsi = Hcs.Service.Async.Nsi.v15_7_0_1;
|
||||
namespace Hcs.Service.Async.Nsi.v15_7_0_1
|
||||
{
|
||||
public partial class AckRequestAck : IHcsAck { }
|
||||
public partial class getStateResult : IHcsGetStateResult { }
|
||||
public partial class getStateResult : IHcsGetStateResultMany { }
|
||||
public partial class Fault : IHcsFault { }
|
||||
public partial class HeaderType : IHcsHeaderType { }
|
||||
}
|
||||
|
||||
namespace Hcs.ClientApi.NsiApi
|
||||
{
|
||||
public class HcsNsiMethod : HcsRemoteCallMethod
|
||||
internal class HcsNsiMethod : HcsRemoteCallMethod<IHcsGetStateResultMany>
|
||||
{
|
||||
public HcsEndPoints EndPoint => HcsEndPoints.NsiAsync;
|
||||
|
||||
@ -35,7 +35,7 @@ namespace Hcs.ClientApi.NsiApi
|
||||
return client;
|
||||
}
|
||||
|
||||
public async Task<IHcsGetStateResult> SendAndWaitResultAsync(
|
||||
public async Task<IHcsGetStateResultMany> SendAndWaitResultAsync(
|
||||
object request,
|
||||
Func<Nsi.NsiPortsTypeAsyncClient, Task<IHcsAck>> sender,
|
||||
CancellationToken token)
|
||||
@ -56,7 +56,7 @@ namespace Hcs.ClientApi.NsiApi
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<IHcsGetStateResult> SendAndWaitResultAsyncImpl(
|
||||
private async Task<IHcsGetStateResultMany> SendAndWaitResultAsyncImpl(
|
||||
object request,
|
||||
Func<Nsi.NsiPortsTypeAsyncClient, Task<IHcsAck>> sender,
|
||||
CancellationToken token)
|
||||
@ -90,7 +90,7 @@ namespace Hcs.ClientApi.NsiApi
|
||||
/// Выполняет однократную проверку наличия результата.
|
||||
/// Возвращает null если результата еще нет.
|
||||
/// </summary>
|
||||
protected override async Task<IHcsGetStateResult> TryGetResultAsync(IHcsAck sourceAck, CancellationToken token)
|
||||
protected override async Task<IHcsGetStateResultMany> TryGetResultAsync(IHcsAck sourceAck, CancellationToken token)
|
||||
{
|
||||
using (var client = NewPortClient())
|
||||
{
|
||||
|
||||
@ -0,0 +1,88 @@
|
||||
using Hcs.ClientApi.DataTypes;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using NsiCommon = Hcs.Service.Async.NsiCommon.v15_7_0_1;
|
||||
|
||||
namespace Hcs.ClientApi.NsiCommonApi
|
||||
{
|
||||
/// <summary>
|
||||
/// Операции экспорта общих справочников подсистемы НСИ
|
||||
/// </summary>
|
||||
internal class HcsMethodExportNsiCommon : HcsNsiCommonMethod
|
||||
{
|
||||
public HcsMethodExportNsiCommon(HcsClientConfig config) : base(config)
|
||||
{
|
||||
EnableMinimalResponseWaitDelay = true;
|
||||
CanBeRestarted = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Возвращает общий справочник подсистемы НСИ
|
||||
/// </summary>
|
||||
/// <param name="regNum">Реестровый номер справочника</param>
|
||||
/// <param name="token">Токен отмены</param>
|
||||
/// <returns>Справочник</returns>
|
||||
public async Task<ГисСправочник> GetNsiItem(int regNum, CancellationToken token)
|
||||
{
|
||||
var request = new NsiCommon.exportNsiItemRequest
|
||||
{
|
||||
Id = HcsConstants.SignedXmlElementId,
|
||||
RegistryNumber = regNum.ToString(),
|
||||
// http://open-gkh.ru/NsiCommon/exportNsiItemRequest.html
|
||||
version = "10.0.1.2"
|
||||
};
|
||||
|
||||
var stateResult = await SendAndWaitResultAsync(request, async (portClient) =>
|
||||
{
|
||||
var response = await portClient.exportNsiItemAsync(CreateRequestHeader(), request);
|
||||
return response.AckRequest.Ack;
|
||||
}, token);
|
||||
|
||||
return AdoptNsiItemType(stateResult.Item as NsiCommon.NsiItemType);
|
||||
}
|
||||
|
||||
private ГисСправочник AdoptNsiItemType(NsiCommon.NsiItemType input)
|
||||
{
|
||||
var справочник = new ГисСправочник()
|
||||
{
|
||||
реестровыйНомер = input.NsiItemRegistryNumber,
|
||||
датаФормирования = input.Created,
|
||||
элементы = AdoptNsiElementTypes(input.NsiElement)
|
||||
};
|
||||
|
||||
return справочник;
|
||||
}
|
||||
|
||||
private ГисЭлементСправочника[] AdoptNsiElementTypes(NsiCommon.NsiElementType[] input)
|
||||
{
|
||||
var элементыСправочника = new List<ГисЭлементСправочника>();
|
||||
foreach (var element in input)
|
||||
{
|
||||
var поляЭлементаСправочника = new List<ГисПолеЭлементаСправочника>();
|
||||
foreach (var field in element.NsiElementField)
|
||||
{
|
||||
CallOnType<NsiCommon.NsiElementStringFieldType>(field, x =>
|
||||
{
|
||||
поляЭлементаСправочника.Add(new ГисПолеЭлементаСправочника()
|
||||
{
|
||||
наименование = x.Name,
|
||||
значение = x.Value
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
элементыСправочника.Add(new ГисЭлементСправочника()
|
||||
{
|
||||
код = element.Code,
|
||||
гуид = ParseGuid(element.GUID),
|
||||
актуальный = element.IsActual,
|
||||
поля = [.. поляЭлементаСправочника],
|
||||
элементы = element.ChildElement?.Length > 0 ? AdoptNsiElementTypes(element.ChildElement) : null
|
||||
});
|
||||
}
|
||||
return [.. элементыСправочника];
|
||||
}
|
||||
}
|
||||
}
|
||||
35
Hcs.Client/ClientApi/NsiCommonApi/HcsNsiCommonApi.cs
Normal file
35
Hcs.Client/ClientApi/NsiCommonApi/HcsNsiCommonApi.cs
Normal file
@ -0,0 +1,35 @@
|
||||
using Hcs.ClientApi.DataTypes;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Hcs.ClientApi.NsiCommonApi
|
||||
{
|
||||
public class HcsNsiCommonApi
|
||||
{
|
||||
public HcsClientConfig Config { get; private set; }
|
||||
|
||||
public HcsNsiCommonApi(HcsClientConfig config)
|
||||
{
|
||||
Config = config;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Возвращает данные справочников поставщика информации
|
||||
/// </summary>
|
||||
/// <param name="regNum">Реестровый номер справочника</param>
|
||||
/// <param name="token">Токен отмены</param>
|
||||
/// <returns>Список справочников</returns>
|
||||
public async Task<ГисСправочник> GetNsiItem(int regNum, CancellationToken token = default)
|
||||
{
|
||||
try
|
||||
{
|
||||
var method = new HcsMethodExportNsiCommon(Config);
|
||||
return await method.GetNsiItem(regNum, token);
|
||||
}
|
||||
catch (HcsNoResultsRemoteException)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
111
Hcs.Client/ClientApi/NsiCommonApi/HcsNsiCommonMethod.cs
Normal file
111
Hcs.Client/ClientApi/NsiCommonApi/HcsNsiCommonMethod.cs
Normal file
@ -0,0 +1,111 @@
|
||||
using Hcs.ClientApi.RemoteCaller;
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using NsiCommon = Hcs.Service.Async.NsiCommon.v15_7_0_1;
|
||||
|
||||
namespace Hcs.Service.Async.NsiCommon.v15_7_0_1
|
||||
{
|
||||
public partial class AckRequestAck : IHcsAck { }
|
||||
public partial class getStateResult : IHcsGetStateResultOne { }
|
||||
public partial class Fault : IHcsFault { }
|
||||
public partial class HeaderType : IHcsHeaderType { }
|
||||
}
|
||||
|
||||
namespace Hcs.ClientApi.NsiCommonApi
|
||||
{
|
||||
internal class HcsNsiCommonMethod : HcsRemoteCallMethod<IHcsGetStateResultOne>
|
||||
{
|
||||
public HcsEndPoints EndPoint => HcsEndPoints.NsiCommonAsync;
|
||||
|
||||
public NsiCommon.ISRequestHeader CreateRequestHeader() =>
|
||||
HcsRequestHelper.CreateHeader<NsiCommon.ISRequestHeader>(ClientConfig);
|
||||
|
||||
public HcsNsiCommonMethod(HcsClientConfig config) : base(config) { }
|
||||
|
||||
public System.ServiceModel.EndpointAddress RemoteAddress
|
||||
=> GetEndpointAddress(HcsConstants.EndPointLocator.GetPath(EndPoint));
|
||||
|
||||
private NsiCommon.NsiPortsTypeAsyncClient NewPortClient()
|
||||
{
|
||||
var client = new NsiCommon.NsiPortsTypeAsyncClient(_binding, RemoteAddress);
|
||||
ConfigureEndpointCredentials(client.Endpoint, client.ClientCredentials);
|
||||
return client;
|
||||
}
|
||||
|
||||
public async Task<IHcsGetStateResultOne> SendAndWaitResultAsync(
|
||||
object request,
|
||||
Func<NsiCommon.NsiPortsTypeAsyncClient, Task<IHcsAck>> sender,
|
||||
CancellationToken token)
|
||||
{
|
||||
token.ThrowIfCancellationRequested();
|
||||
|
||||
while (true)
|
||||
{
|
||||
try
|
||||
{
|
||||
return await SendAndWaitResultAsyncImpl(request, sender, token);
|
||||
}
|
||||
catch (HcsRestartTimeoutException e)
|
||||
{
|
||||
if (!CanBeRestarted) throw new HcsException("Превышен лимит ожидания выполнения запроса", e);
|
||||
Log($"Перезапускаем запрос типа {request.GetType().Name}...");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<IHcsGetStateResultOne> SendAndWaitResultAsyncImpl(
|
||||
object request,
|
||||
Func<NsiCommon.NsiPortsTypeAsyncClient, Task<IHcsAck>> sender,
|
||||
CancellationToken token)
|
||||
{
|
||||
if (request == null) throw new ArgumentNullException("Null request");
|
||||
string version = HcsRequestHelper.GetRequestVersionString(request);
|
||||
_config.Log($"Отправляем запрос: {RemoteAddress.Uri}/{request.GetType().Name} в версии {version}...");
|
||||
|
||||
var stopWatch = System.Diagnostics.Stopwatch.StartNew();
|
||||
|
||||
IHcsAck ack;
|
||||
using (var client = NewPortClient())
|
||||
{
|
||||
ack = await sender(client);
|
||||
}
|
||||
|
||||
stopWatch.Stop();
|
||||
_config.Log($"Запрос принят в обработку за {stopWatch.ElapsedMilliseconds}мс., подтверждение {ack.MessageGUID}");
|
||||
|
||||
var stateResult = await WaitForResultAsync(ack, true, token);
|
||||
|
||||
if (stateResult.Item is NsiCommon.ErrorMessageType x)
|
||||
{
|
||||
throw HcsRemoteException.CreateNew(x.ErrorCode, x.Description);
|
||||
}
|
||||
|
||||
return stateResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Выполняет однократную проверку наличия результата.
|
||||
/// Возвращает null если результата еще нет.
|
||||
/// </summary>
|
||||
protected override async Task<IHcsGetStateResultOne> TryGetResultAsync(IHcsAck sourceAck, CancellationToken token)
|
||||
{
|
||||
using (var client = NewPortClient())
|
||||
{
|
||||
var requestHeader = HcsRequestHelper.CreateHeader<NsiCommon.ISRequestHeader>(_config);
|
||||
var requestBody = new NsiCommon.getStateRequest { MessageGUID = sourceAck.MessageGUID };
|
||||
|
||||
var response = await client.getStateAsync(requestHeader, requestBody);
|
||||
var resultBody = response.getStateResult;
|
||||
|
||||
if (resultBody.RequestState == HcsAsyncRequestStateTypes.Ready)
|
||||
{
|
||||
return resultBody;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -9,14 +9,14 @@ using OrgRegistryCommon = Hcs.Service.Async.OrgRegistryCommon.v15_7_0_1;
|
||||
namespace Hcs.Service.Async.OrgRegistryCommon.v15_7_0_1
|
||||
{
|
||||
public partial class AckRequestAck : IHcsAck { }
|
||||
public partial class getStateResult : IHcsGetStateResult { }
|
||||
public partial class getStateResult : IHcsGetStateResultMany { }
|
||||
public partial class Fault : IHcsFault { }
|
||||
public partial class HeaderType : IHcsHeaderType { }
|
||||
}
|
||||
|
||||
namespace Hcs.ClientApi.OrgRegistryCommonApi
|
||||
{
|
||||
public class HcsOrgRegistryCommonMethod : HcsRemoteCallMethod
|
||||
public class HcsOrgRegistryCommonMethod : HcsRemoteCallMethod<IHcsGetStateResultMany>
|
||||
{
|
||||
public HcsEndPoints EndPoint => HcsEndPoints.OrgRegistryCommonAsync;
|
||||
|
||||
@ -35,7 +35,7 @@ namespace Hcs.ClientApi.OrgRegistryCommonApi
|
||||
return client;
|
||||
}
|
||||
|
||||
public async Task<IHcsGetStateResult> SendAndWaitResultAsync(
|
||||
public async Task<IHcsGetStateResultMany> SendAndWaitResultAsync(
|
||||
object request,
|
||||
Func<OrgRegistryCommon.RegOrgPortsTypeAsyncClient, Task<IHcsAck>> sender,
|
||||
CancellationToken token)
|
||||
@ -56,7 +56,7 @@ namespace Hcs.ClientApi.OrgRegistryCommonApi
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<IHcsGetStateResult> SendAndWaitResultAsyncImpl(
|
||||
private async Task<IHcsGetStateResultMany> SendAndWaitResultAsyncImpl(
|
||||
object request,
|
||||
Func<OrgRegistryCommon.RegOrgPortsTypeAsyncClient, Task<IHcsAck>> sender,
|
||||
CancellationToken token)
|
||||
@ -90,7 +90,7 @@ namespace Hcs.ClientApi.OrgRegistryCommonApi
|
||||
/// Выполняет однократную проверку наличия результата.
|
||||
/// Возвращает null если результата еще нет.
|
||||
/// </summary>
|
||||
protected override async Task<IHcsGetStateResult> TryGetResultAsync(IHcsAck sourceAck, CancellationToken token)
|
||||
protected override async Task<IHcsGetStateResultMany> TryGetResultAsync(IHcsAck sourceAck, CancellationToken token)
|
||||
{
|
||||
using (var client = NewPortClient())
|
||||
{
|
||||
|
||||
@ -13,7 +13,7 @@ namespace Hcs.ClientApi.RemoteCaller
|
||||
/// <summary>
|
||||
/// Базовый класс для методов HCS вызываемых удаленно
|
||||
/// </summary>
|
||||
public abstract class HcsRemoteCallMethod
|
||||
public abstract class HcsRemoteCallMethod<T> where T : IHcsGetStateResult
|
||||
{
|
||||
public HcsClientConfig _config;
|
||||
protected CustomBinding _binding;
|
||||
@ -144,7 +144,7 @@ namespace Hcs.ClientApi.RemoteCaller
|
||||
/// Выполнение одной попытки пооучить результат операции.
|
||||
/// Реализуется в производных классах.
|
||||
/// </summary>
|
||||
protected abstract Task<IHcsGetStateResult> TryGetResultAsync(IHcsAck sourceAck, CancellationToken token);
|
||||
protected abstract Task<T> TryGetResultAsync(IHcsAck sourceAck, CancellationToken token);
|
||||
|
||||
/// <summary>
|
||||
/// Основной алгоритм ожидания ответа на асинхронный запрос.
|
||||
@ -156,11 +156,11 @@ namespace Hcs.ClientApi.RemoteCaller
|
||||
/// - в случае, если на третий запрос getSate получен результат с RequestState равным "1" или "2", то следующий запрос getState необходимо направлять не ранее чем через 900 секунд после отправки предыдущего запроса;
|
||||
/// - в случае, если на четвертый(и все последующие запросы) getState получен результат с RequestState равным "1" или "2", то следующий запрос getState необходимо направлять не ранее чем через 1800 секунд после отправки предыдущего запроса.
|
||||
/// </summary>
|
||||
protected async Task<IHcsGetStateResult> WaitForResultAsync(
|
||||
protected async Task<T> WaitForResultAsync(
|
||||
IHcsAck ack, bool withInitialDelay, CancellationToken token)
|
||||
{
|
||||
var startTime = DateTime.Now;
|
||||
IHcsGetStateResult result;
|
||||
T result;
|
||||
for (int attempts = 1; ; attempts++)
|
||||
{
|
||||
token.ThrowIfCancellationRequested();
|
||||
@ -190,7 +190,7 @@ namespace Hcs.ClientApi.RemoteCaller
|
||||
if (result != null) break;
|
||||
}
|
||||
|
||||
_config.Log($"Ответ получен, число частей: {result.Items.Count()}");
|
||||
_config.Log($"Ответ получен");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
namespace Hcs.ClientApi.RemoteCaller
|
||||
{
|
||||
public interface IHcsGetStateResult
|
||||
{
|
||||
object[] Items { get; set; }
|
||||
}
|
||||
/// <summary>
|
||||
/// Интерфейс-маркер
|
||||
/// </summary>
|
||||
public interface IHcsGetStateResult { }
|
||||
}
|
||||
|
||||
@ -0,0 +1,7 @@
|
||||
namespace Hcs.ClientApi.RemoteCaller
|
||||
{
|
||||
public interface IHcsGetStateResultMany : IHcsGetStateResult
|
||||
{
|
||||
object[] Items { get; set; }
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
namespace Hcs.ClientApi.RemoteCaller
|
||||
{
|
||||
public interface IHcsGetStateResultOne : IHcsGetStateResult
|
||||
{
|
||||
object Item { get; set; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user