From 3a0cd5f454c0fd89ba55c0a813cb15f998247f21 Mon Sep 17 00:00:00 2001 From: Raffi Baghdasaryan Date: Thu, 14 Mar 2024 15:37:57 +0100 Subject: [PATCH] COREX-346 CoreDataService keeps crashing (#26) - Add error handling when disposing AnnouncementClient --- .../DefaultAnnouncementClientWrapper.cs | 20 +++++++++++++++---- ...DefaultAnnouncementClientWrapperFactory.cs | 10 +++++++++- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/ServiceModel/ServiceModel/ServiceModel/Discovery/DefaultAnnouncementClientWrapper.cs b/src/ServiceModel/ServiceModel/ServiceModel/Discovery/DefaultAnnouncementClientWrapper.cs index ef1dd4c..00e60e6 100644 --- a/src/ServiceModel/ServiceModel/ServiceModel/Discovery/DefaultAnnouncementClientWrapper.cs +++ b/src/ServiceModel/ServiceModel/ServiceModel/Discovery/DefaultAnnouncementClientWrapper.cs @@ -1,3 +1,4 @@ +using Microsoft.Extensions.Logging; using System; using System.ServiceModel; using System.ServiceModel.Discovery; @@ -7,10 +8,12 @@ namespace EMG.Utilities.ServiceModel.Discovery public class DefaultAnnouncementClientWrapper : IAnnouncementClientWrapper { private readonly AnnouncementClient _client; + private readonly ILogger _logger; - public DefaultAnnouncementClientWrapper(AnnouncementClient client) + public DefaultAnnouncementClientWrapper(AnnouncementClient client, ILogger logger) { _client = client ?? throw new ArgumentNullException(nameof(client)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public void AnnounceOnline(EndpointDiscoveryMetadata metadata) @@ -27,13 +30,22 @@ public void Dispose() { var communicationObject = _client as ICommunicationObject; - if (communicationObject.State != CommunicationState.Faulted) + try { - ((IDisposable)_client).Dispose(); + if (communicationObject.State != CommunicationState.Faulted) + { + ((IDisposable)_client).Dispose(); + } + else + { + communicationObject.Abort(); + } } - else + catch (Exception ex) { communicationObject.Abort(); + + _logger.LogError(ex, "An error occurred while disposing the announcement client"); } } } diff --git a/src/ServiceModel/ServiceModel/ServiceModel/Discovery/DefaultAnnouncementClientWrapperFactory.cs b/src/ServiceModel/ServiceModel/ServiceModel/Discovery/DefaultAnnouncementClientWrapperFactory.cs index 34d8b46..2384999 100644 --- a/src/ServiceModel/ServiceModel/ServiceModel/Discovery/DefaultAnnouncementClientWrapperFactory.cs +++ b/src/ServiceModel/ServiceModel/ServiceModel/Discovery/DefaultAnnouncementClientWrapperFactory.cs @@ -1,3 +1,4 @@ +using Microsoft.Extensions.Logging; using System; using System.ServiceModel; using System.ServiceModel.Channels; @@ -7,13 +8,20 @@ namespace EMG.Utilities.ServiceModel.Discovery { public class DefaultAnnouncementClientWrapperFactory : IAnnouncementClientWrapperFactory { + private readonly ILogger _logger; + + public DefaultAnnouncementClientWrapperFactory(ILogger logger) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + public IAnnouncementClientWrapper Create(Uri registryUrl, Binding binding) { var endpointAddress = new EndpointAddress(registryUrl); var endpoint = new AnnouncementEndpoint(binding, endpointAddress); var client = new AnnouncementClient(endpoint); - var wrapper = new DefaultAnnouncementClientWrapper(client); + var wrapper = new DefaultAnnouncementClientWrapper(client, _logger); return wrapper; }