Все вызовы службы должны работать через личный канал. Таким образом, все методы, которые имеют доступ к прокси-серверу должен выглядеть как этот:Как переносить вызовы методов с ожиданием?
public async Task<SDRLocation[]> FindLocationsAsync(string searchString)
{
ChannelFactory<IQueryService> channel = new ChannelFactory<IQueryService>("SomeServ_IQuery");
channel.Open();
SomeProxy = channel.CreateChannel();
Location[] locationEntitiesFound = await SomeProxy.FindLocationsAsync(searchString);
((IChannel)SomeProxy).Close();
return locationEntitiesFound.Select(x => new SDRLocation(x)).ToArray();
}
Но поскольку у меня есть много способов, как это обслуживания вызовов я пытался избежать дублирования кода и создать этот метод обертку:
public TResult HandleServiceCall<TResult>(Func<IPlantOrgQueryService, TResult> serviceMethod)
{
ChannelFactory<IQueryService> channel = new ChannelFactory<IQueryService>("SomeServ_IQuery");
channel.Open();
IQueryService newProxy = channel.CreateChannel();
TResult results = serviceMethod(newProxy);
((IChannel)newProxy).Close();
return results;
}
теперь я ожидаю, чтобы везде называет так:
public async Task<SDRLocation[]> FindLocationsAsync(string searchString)
{
Location[] locationEntitiesFound = await HandleServiceCall(x => x.FindLocationsAsync(searchString));
return locationEntitiesFound.Select(x => new SDRLocation(x)).ToArray();
}
Но я в конечном итоге с ошибкой «коммуникационный объект System.ServiceModel.Channels.ClientReliableDu plexSessionChannel, не может использоваться для связи, поскольку он был отменен ».
Не понимаю, что это неправильно, потому что метод без HandleServiceCall работает просто отлично ...
Помогите пожалуйста
Это точно, что я думал. Благодаря! –