protected override async Task ExecuteAsync(IServiceProvider provider, CancellationToken cancellationToken)
        {
            var configurationRepository = provider.GetRequiredService <ITokenConfigurationRepository>();
            var configurationService    = provider.GetRequiredService <ITokenConfigurationService>();
            var config = provider.GetRequiredService <IAuthorityClientConfig>();

            Task <TokenConfigurationModel> Operation(ILoggingContext context, CancellationToken cancellationToken)
            {
                return(configurationService.GetAsync(config.AuthorityUrl, context, cancellationToken));
            }

            var operationConfig = new RetryOperationConfig
            {
                RetryCount     = configurationRepository.IsSet() ? 3 : (int?)null,
                RetryPolicy    = new RetryPolicy(TimeSpan.FromSeconds(30), 2),
                SameExceptions = SameExceptions
            };

            using (fLogger.TrackDependency(fContext, "REST", "Token configuration service loading.", RoleNames._AuthorityService, string.Empty, out var trackingContext))
            {
                await new RetryOperation <TokenConfigurationModel>(Operation, operationConfig)
                .Catch <TokenConfigurationModel, HttpRequestException>(fLogger)
                .Catch <TokenConfigurationModel, Exception>(fLogger, true)
                .OnFail(trackingContext)
                .OnFail(fLogger, "Unable to load authority configuration. Signing key may be deprecated!")
                .OnSuccess(trackingContext)
                .OnSuccess(fLogger, "Loaded new authority configuration.")
                .OnSuccess((result, _) => configurationRepository.Set(result))
                .ExecuteAsync(trackingContext, cancellationToken);
            }
        }
Ejemplo n.º 2
0
        private async Task AuthorizeConnectionAsync(ILoggingContext context, CancellationToken cancellationToken)
        {
            async Task Operation(ILoggingContext context, CancellationToken cancellationToken)
            {
                await LoginAsync(fConfig.ClientId, fConfig.ClientSecret, context, cancellationToken);
                await SubscribeResourcesAsync(fConfig.SubscribedResources, context, cancellationToken);
            }

            var operationConfig = new RetryOperationConfig
            {
                RetryCount  = null,
                RetryPolicy = new Operations.RetryPolicy(TimeSpan.FromSeconds(60), 2)
            };

            using (fLogger.TrackRequest(context, "Authorizing SignalR connection.", out var requestContext))
            {
                await new RetryOperation(Operation, operationConfig)
                .Catch <Unit, HttpRequestException>(fLogger)
                .Catch <Unit, WebSocketException>(fLogger)
                .Catch <Unit, HubException>(fLogger)
                .Catch <Unit, Exception>(fLogger, true)
                .OnSuccess(requestContext)
                .OnFail(requestContext)
                .OnFailRethrow()
                .ExecuteAsync(requestContext, cancellationToken);
            }
        }
        public async Task InitialConnectAsync(HubConnection hubConnection, Uri signalUrl, ILoggingContext context, CancellationToken cancellationToken)
        {
            var config = new RetryOperationConfig
            {
                RetryCount     = null,
                RetryPolicy    = new RetryPolicy(TimeSpan.FromSeconds(60), 2),
                SameExceptions = SameExceptions
            };

            await new RetryOperation((_, cancellationToken) => hubConnection.StartAsync(cancellationToken), config)
            .Catch <Unit, WebSocketException>(fLogger)
            .Catch <Unit, Exception>(fLogger, true)
            .OnRetryInformation(fLogger, $"Retrying to connect to '{signalUrl}' ...")
            .OnSuccess(fLogger, $"Successfuly connected to '{signalUrl}'.")
            .OnFail(fLogger, $"Unable to connect to '{signalUrl}'.")
            .OnFailRethrow()
            .ExecuteAsync(context, cancellationToken);
        }