using Microsoft.Extensions.Logging; namespace ZB.MOM.WW.OtOpcUa.Host.OpcUa; /// Coordinates endpoint cleanup after ServiceLevel binding fails during startup. internal static class FailedServiceLevelBindingCleanup { /// Stops and disposes the endpoint, returning whether ownership can be released. /// The SDK stop operation. /// The application-host disposal operation. /// The cleanup logger. /// Whether cleanup completed successfully. internal static async Task StopAndDisposeAsync( Func stop, Func dispose, ILogger logger) { var completed = true; try { await stop().ConfigureAwait(false); } catch (Exception ex) { completed = false; logger.LogError(ex, "OtOpcUaServerHostedService: SDK stop failed after binding failure; retaining endpoint ownership for shutdown retry"); } // Attempt application cleanup even when stopping faults; keep ownership on either failure. try { await dispose().ConfigureAwait(false); } catch (Exception ex) { completed = false; logger.LogError(ex, "OtOpcUaServerHostedService: endpoint disposal failed after binding failure; retaining endpoint ownership for shutdown retry"); } return completed; } }