protected override async Task OpenLinkAsync(AmqpObject link, IotHubConnectionString connectionString, string audience, TimeSpan timeout, CancellationToken token) { var timeoutHelper = new TimeoutHelper(timeout); token.ThrowIfCancellationRequested(); try { // this is a device-scope connection string. We need to send a CBS token for this specific link before opening it. var iotHubLinkTokenRefresher = new IotHubTokenRefresher(this.FaultTolerantSession.Value, connectionString, audience); if (this.iotHubTokenRefreshers.TryAdd(link, iotHubLinkTokenRefresher)) { link.SafeAddClosed((s, e) => { if (this.iotHubTokenRefreshers.TryRemove(link, out iotHubLinkTokenRefresher)) { iotHubLinkTokenRefresher.Cancel(); } }); // Send Cbs token for new link first // This will throw an exception if the device is not valid or if the token is not valid await iotHubLinkTokenRefresher.SendCbsTokenAsync(timeoutHelper.RemainingTime()).ConfigureAwait(false); } token.ThrowIfCancellationRequested(); // Open Amqp Link await link.OpenAsync(timeoutHelper.RemainingTime()).ConfigureAwait(false); } catch (Exception exception) when(!exception.IsFatal()) { link.SafeClose(exception); throw; } }
private static async Task OpenLinkAsync(AmqpObject link, TimeSpan timeout) { Logging.Enter(link, link.State, timeout, nameof(OpenLinkAsync)); try { var timeoutHelper = new TimeoutHelper(timeout); try { await link.OpenAsync(timeoutHelper.RemainingTime()).ConfigureAwait(false); } catch (Exception exception) { Logging.Error(link, exception, nameof(OpenLinkAsync)); if (exception.IsFatal()) { throw; } link.SafeClose(exception); throw; } } finally { Logging.Exit(link, link.State, timeout, nameof(OpenLinkAsync)); } }
/// <summary> /// Performs the actions needed to open an AMQP object, such /// as a session or link for use. /// </summary> /// /// <param name="target">The target AMQP object to open.</param> /// <param name="timeout">The timeout to apply when opening the link.</param> protected virtual async Task OpenAmqpObjectAsync( AmqpObject target, TimeSpan timeout) { try { await target.OpenAsync(timeout).ConfigureAwait(false); } catch { switch (target) { case AmqpLink linkTarget: linkTarget.Session?.SafeClose(); break; case RequestResponseAmqpLink linkTarget: linkTarget.Session?.SafeClose(); break; default: break; } target.SafeClose(); throw; } }
protected override async Task OpenLinkAsync(AmqpObject link, IotHubConnectionString doNotUse, string doNotUse2, TimeSpan timeout, CancellationToken token) { if (Logging.IsEnabled) { Logging.Enter(this, timeout, token, $"{nameof(IotHubSingleTokenConnection)}.{nameof(OpenLinkAsync)}"); } token.ThrowIfCancellationRequested(); try { await link.OpenAsync(timeout).ConfigureAwait(false); } catch (Exception exception) { if (exception.IsFatal()) { throw; } link.SafeClose(exception); throw; } finally { if (Logging.IsEnabled) { Logging.Exit(this, timeout, token, $"{nameof(IotHubSingleTokenConnection)}.{nameof(OpenLinkAsync)}"); } } }
protected override async Task OpenLinkAsync(AmqpObject link, IotHubConnectionString doNotUse, string doNotUse2, TimeSpan timeout) { try { await link.OpenAsync(timeout); } catch (Exception exception) { if (exception.IsFatal()) { throw; } link.SafeClose(exception); throw; } }
protected override async Task OpenLinkAsync(AmqpObject link, IotHubConnectionString doNotUse, string doNotUse2, TimeSpan timeout, CancellationToken token) { token.ThrowIfCancellationRequested(); try { await link.OpenAsync(timeout).ConfigureAwait(false); } catch (Exception exception) { if (exception.IsFatal()) { throw; } link.SafeClose(exception); throw; } }
static async Task OpenLinkAsync(AmqpObject link, TimeSpan timeout) { var timeoutHelper = new TimeoutHelper(timeout); try { await link.OpenAsync(timeoutHelper.RemainingTime()); } catch (Exception exception) { if (exception.IsFatal()) { throw; } link.SafeClose(exception); throw; } }
protected override async Task OpenLinkAsync(AmqpObject link, IotHubConnectionString connectionString, string audience, TimeSpan timeout) { var timeoutHelper = new TimeoutHelper(timeout); try { // this is a device-scope connection string. We need to send a CBS token for this specific link before opening it. var iotHubLinkTokenRefresher = new IotHubTokenRefresher( this.FaultTolerantSession.Value, connectionString, audience ); if (this.iotHubTokenRefreshers.TryAdd(link, iotHubLinkTokenRefresher)) { link.SafeAddClosed((s, e) => { if (this.iotHubTokenRefreshers.TryRemove(link, out iotHubLinkTokenRefresher)) { iotHubLinkTokenRefresher.Cancel(); } }); // Send Cbs token for new link first await iotHubLinkTokenRefresher.SendCbsTokenAsync(timeoutHelper.RemainingTime()); } // Open Amqp Link await link.OpenAsync(timeoutHelper.RemainingTime()); } catch (Exception exception) { if (exception.IsFatal()) { throw; } link.SafeClose(exception); throw; } }