private static ChannelFactory<InterDataServiceChannel> _factory; private static object _lock = new object(); private InterDataServiceClient _client = null; ILogBase _logBase; public ClientHelper(ILogBase logBase) { _logBase = logBase; } public virtual void Dispose() { CloseChannel(); CloseFactory(); } protected void CloseChannel() { lock (_lock) { if (_client != null) { try { _client.Close(); } catch (TimeoutException tmEx/* timeout */) { _logBase.Error($"CloseChannel TimeoutException :{tmEx.Message}", tmEx); // Handle the timeout exception _client.Abort(); } catch (CommunicationException ccEx /* communicationException */) { _logBase.Error($"CloseChannel CommunicationException :{ccEx.Message}", ccEx); _client.Abort(); } catch (Exception e) { _logBase.Error($"CloseChannel Exception :{e.Message}", e); _client.Abort(); throw ; } _client = null; } } } protected void CloseFactory() { lock (_lock) { if (_factory!=null) { try { _factory.Close(); } catch (TimeoutException tmEx/* timeout */) { _logBase.Error($"CloseFactory TimeoutException :{tmEx.Message}", tmEx); // Handle the timeout exception _factory.Abort(); } catch (CommunicationException ccEx/* communicationException */) { _logBase.Error($"CloseFactory TimeoutException :{ccEx.Message}", ccEx); // Handle the communication exception _factory.Abort(); } catch(Exception e) { _logBase.Error($"CloseFactory Exception :{e.Message}", e); throw; } } _factory = null; } } private void CreateFactory() { // ... set up custom bindings here and get some config values var endpoint = GetEndpointAddr(); var binding = GetBindingForEndpoint(); _factory = new ChannelFactory<InterDataServiceChannel>(binding, endpoint); } protected ChannelFactory<InterDataServiceChannel> Factory { get { if (_factory == null ) { // ... set up custom bindings here and get some config values CreateFactory(); } else if(_factory.State != CommunicationState.Opening) { CloseFactory(); CreateFactory(); } return _factory; } } private void CreateClient() { _client = (InterDataServiceClient)Factory.CreateChannel(); SetClientCredential(_client.ClientCredentials.Windows.ClientCredential); } protected InterDataServiceClient Client { get { if (_client == null) { CreateClient(); } else { if (_client.State != CommunicationState.Opening) { CloseChannel(); } CreateClient(); } return _client; } } public InterDataServiceClient GetDefaultOAClient() { return Client; }