diff --git a/src/clients/Elsa.Api.Client/Elsa.Api.Client.csproj b/src/clients/Elsa.Api.Client/Elsa.Api.Client.csproj index a4030f0fa..aaaec27c0 100644 --- a/src/clients/Elsa.Api.Client/Elsa.Api.Client.csproj +++ b/src/clients/Elsa.Api.Client/Elsa.Api.Client.csproj @@ -1,10 +1,10 @@ - - - + + + + - netstandard2.1 Provides HTTP clients for the Elsa Workflows REST API. @@ -12,17 +12,22 @@ - + + + - + + + - + - - - + + + + - + diff --git a/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs b/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs index 5c58a6565..d3864079a 100644 --- a/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs +++ b/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs @@ -2,9 +2,8 @@ using System.Text.Json; using System.Text.Json.Serialization; using Elsa.Api.Client.Contracts; using Elsa.Api.Client.Converters; -using Elsa.Api.Client.HttpMessageHandlers; using Elsa.Api.Client.Options; -using Elsa.Api.Client.Resources.ActivityDescriptorOptions.Contracts; +using Elsa.Api.Client.Resources.ActivityDescriptorOptions.Contracts; using Elsa.Api.Client.Resources.ActivityDescriptors.Contracts; using Elsa.Api.Client.Resources.ActivityExecutions.Contracts; using Elsa.Api.Client.Resources.Features.Contracts; @@ -21,6 +20,7 @@ using Elsa.Api.Client.Services; using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; +using Polly; using Refit; namespace Elsa.Api.Client.Extensions; @@ -38,11 +38,9 @@ public static class DependencyInjectionExtensions { var builderOptions = new ElsaClientBuilderOptions(); configureBuilderOptions?.Invoke(builderOptions); - - services.Configure(configureOptions ?? (_ => { })); - services.AddScoped(); - services.AddScoped(); + services.Configure(configureOptions ?? (_ => { })); + services.AddScoped(); services.AddApi(builderOptions); services.AddApi(builderOptions); services.AddApi(builderOptions); @@ -68,18 +66,22 @@ public static class DependencyInjectionExtensions /// The type representing the API. public static void AddApi(this IServiceCollection services, ElsaClientBuilderOptions? httpClientBuilderOptions = default) where T : class { - var builder = services.AddRefitClient(CreateRefitSettings).ConfigureHttpClient(ConfigureElsaApiHttpClient); + var builder = services.AddRefitClient(CreateRefitSettings, typeof(T).Name).ConfigureHttpClient(ConfigureElsaApiHttpClient); httpClientBuilderOptions?.ConfigureHttpClientBuilder?.Invoke(builder); + builder.AddTransientHttpErrorPolicy(p => p.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)))); } - + /// /// Creates an API client for the specified API type. /// public static T CreateApi(this IServiceProvider serviceProvider, Uri baseAddress) where T : class { - return RestService.For(baseAddress.ToString(), CreateRefitSettings(serviceProvider)); + var httpClientFactory = serviceProvider.GetRequiredService(); + var httpClient = httpClientFactory.CreateClient(typeof(T).Name); + httpClient.BaseAddress = baseAddress; + return CreateApi(serviceProvider, httpClient); } - + /// /// Creates an API client for the specified API type. /// @@ -105,18 +107,14 @@ public static class DependencyInjectionExtensions PropertyNamingPolicy = JsonNamingPolicy.CamelCase, }; - var elsaClientOptions = serviceProvider.GetRequiredService>().Value; - serializerOptions.Converters.Add(new JsonStringEnumConverter()); serializerOptions.Converters.Add(new VersionOptionsJsonConverter()); var settings = new RefitSettings { ContentSerializer = new SystemTextJsonContentSerializer(serializerOptions), - HttpMessageHandlerFactory = () => elsaClientOptions.HttpMessageHandlerFactory(serviceProvider) - }; - + }; + return settings; } - } \ No newline at end of file diff --git a/src/clients/Elsa.Api.Client/HttpMessageHandlers/ApiHttpMessageHandler.cs b/src/clients/Elsa.Api.Client/HttpMessageHandlers/ApiHttpMessageHandler.cs deleted file mode 100644 index 84bc5fd03..000000000 --- a/src/clients/Elsa.Api.Client/HttpMessageHandlers/ApiHttpMessageHandler.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Elsa.Api.Client.Contracts; -using Microsoft.Extensions.DependencyInjection; - -namespace Elsa.Api.Client.HttpMessageHandlers; - -/// -/// An HTTP message handler that delegates its processing to another instance provided by an . -/// -public class ApiHttpMessageHandler : DelegatingHandler -{ - /// - public ApiHttpMessageHandler(IServiceProvider serviceProvider) - { - var provider = serviceProvider.GetService(); - - if (provider != null) - InnerHandler = provider.GetHandler(); - } -} \ No newline at end of file diff --git a/src/clients/Elsa.Api.Client/Options/ElsaClientOptions.cs b/src/clients/Elsa.Api.Client/Options/ElsaClientOptions.cs index afea1c581..6ed518720 100644 --- a/src/clients/Elsa.Api.Client/Options/ElsaClientOptions.cs +++ b/src/clients/Elsa.Api.Client/Options/ElsaClientOptions.cs @@ -1,6 +1,3 @@ -using Elsa.Api.Client.HttpMessageHandlers; -using Microsoft.Extensions.DependencyInjection; - namespace Elsa.Api.Client.Options; /// @@ -22,9 +19,4 @@ public class ElsaClientOptions /// Gets or sets a delegate that can be used to configure the HTTP client. /// public Action? ConfigureHttpClient { get; set; } - - /// - /// Gets or sets a delegate that can be used to configure the HTTP client message handler. - /// - public Func HttpMessageHandlerFactory { get; set; } = sp => sp.GetRequiredService(); } \ No newline at end of file diff --git a/src/clients/Elsa.Api.Client/Services/ElsaClientFactory.cs b/src/clients/Elsa.Api.Client/Services/ElsaClientFactory.cs deleted file mode 100644 index 70af8a786..000000000 --- a/src/clients/Elsa.Api.Client/Services/ElsaClientFactory.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Elsa.Api.Client.Contracts; -using Elsa.Api.Client.Extensions; -using Elsa.Api.Client.Options; -using JetBrains.Annotations; -using Microsoft.Extensions.DependencyInjection; - -namespace Elsa.Api.Client.Services; - -/// -[PublicAPI] -public class ElsaClientFactory : IElsaClientFactory -{ - /// - public IElsaClient CreateClient(Action configureOptions, Action? configureHttpClientBuilder = default) - { - var services = new ServiceCollection().AddElsaClient(configureOptions, configureHttpClientBuilder).BuildServiceProvider(); - return services.GetRequiredService(); - } -} \ No newline at end of file