サービスへのすべての呼び出しは、個人用チャネルを介して機能する必要があります。したがって、サーバー プロキシにアクセスできるすべてのメソッドは次のようになります。
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.ClientReliableDuplexSessionChannel は、中止されたため、通信に使用できません」というエラーが表示されます。
HandleServiceCall のないメソッドは問題なく機能するため、何が問題なのかわかりません...
助けてください