Browse Source

Avoid calling AddHttpClient & HttpErrorPolicy multiple times.

Resolve #2009
pull/2201/head
maliming 7 years ago
parent
commit
f9af889743
  1. 62
      framework/src/Volo.Abp.Http.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionDynamicHttpClientProxyExtensions.cs

62
framework/src/Volo.Abp.Http.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionDynamicHttpClientProxyExtensions.cs

@ -41,6 +41,8 @@ namespace Microsoft.Extensions.DependencyInjection
{ {
Check.NotNull(services, nameof(assembly)); Check.NotNull(services, nameof(assembly));
AddHttpClientFactoryAndPolicy(services, remoteServiceConfigurationName, configureHttpClientBuilder);
//TODO: Make a configuration option and add remoteServiceName inside it! //TODO: Make a configuration option and add remoteServiceName inside it!
//TODO: Add option to change type filter //TODO: Add option to change type filter
@ -53,9 +55,8 @@ namespace Microsoft.Extensions.DependencyInjection
services.AddHttpClientProxy( services.AddHttpClientProxy(
serviceType, serviceType,
remoteServiceConfigurationName, remoteServiceConfigurationName,
asDefaultServices, asDefaultServices
configureHttpClientBuilder );
);
} }
return services; return services;
@ -82,14 +83,46 @@ namespace Microsoft.Extensions.DependencyInjection
bool asDefaultService = true, bool asDefaultService = true,
Action<IHttpClientBuilder> configureHttpClientBuilder = null) Action<IHttpClientBuilder> configureHttpClientBuilder = null)
{ {
AddHttpClientFactoryAndPolicy(services, remoteServiceConfigurationName, configureHttpClientBuilder);
return services.AddHttpClientProxy( return services.AddHttpClientProxy(
typeof(T), typeof(T),
remoteServiceConfigurationName, remoteServiceConfigurationName,
asDefaultService, asDefaultService
configureHttpClientBuilder
); );
} }
/// <summary>
/// Use IHttpClientFactory and polly
/// </summary>
/// <param name="services">Service collection</param>
/// <param name="remoteServiceConfigurationName">
/// The name of the remote service configuration to be used by the HTTP Client proxies.
/// See <see cref="AbpRemoteServiceOptions"/>.
/// </param>
/// <param name="configureHttpClientBuilder">
/// A delegate that is used to configure an <see cref="T:Microsoft.Extensions.DependencyInjection.IHttpClientBuilder" />.
/// </param>
public static IServiceCollection AddHttpClientFactoryAndPolicy(
[NotNull] this IServiceCollection services,
[NotNull] string remoteServiceConfigurationName = RemoteServiceConfigurationDictionary.DefaultName,
Action<IHttpClientBuilder> configureHttpClientBuilder = null)
{
var httpClientBuilder = services.AddHttpClient(remoteServiceConfigurationName);
if (configureHttpClientBuilder == null)
{
httpClientBuilder.AddTransientHttpErrorPolicy(builder =>
// retry 3 times
builder.WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(Math.Pow(2, i))));
}
else
{
configureHttpClientBuilder.Invoke(httpClientBuilder);
}
return services;
}
/// <summary> /// <summary>
/// Registers HTTP Client Proxy for given service <paramref name="type"/>. /// Registers HTTP Client Proxy for given service <paramref name="type"/>.
/// </summary> /// </summary>
@ -102,15 +135,11 @@ namespace Microsoft.Extensions.DependencyInjection
/// <param name="asDefaultService"> /// <param name="asDefaultService">
/// True, to register the HTTP client proxy as the default implementation for the service <paramref name="type"/>. /// True, to register the HTTP client proxy as the default implementation for the service <paramref name="type"/>.
/// </param> /// </param>
/// <param name="configureHttpClientBuilder">
/// A delegate that is used to configure an <see cref="T:Microsoft.Extensions.DependencyInjection.IHttpClientBuilder" />.
/// </param>
public static IServiceCollection AddHttpClientProxy( public static IServiceCollection AddHttpClientProxy(
[NotNull] this IServiceCollection services, [NotNull] this IServiceCollection services,
[NotNull] Type type, [NotNull] Type type,
[NotNull] string remoteServiceConfigurationName = RemoteServiceConfigurationDictionary.DefaultName, [NotNull] string remoteServiceConfigurationName = RemoteServiceConfigurationDictionary.DefaultName,
bool asDefaultService = true, bool asDefaultService = true)
Action<IHttpClientBuilder> configureHttpClientBuilder = null)
{ {
Check.NotNull(services, nameof(services)); Check.NotNull(services, nameof(services));
Check.NotNull(type, nameof(type)); Check.NotNull(type, nameof(type));
@ -120,19 +149,6 @@ namespace Microsoft.Extensions.DependencyInjection
{ {
options.HttpClientProxies[type] = new DynamicHttpClientProxyConfig(type, remoteServiceConfigurationName); options.HttpClientProxies[type] = new DynamicHttpClientProxyConfig(type, remoteServiceConfigurationName);
}); });
//use IHttpClientFactory and polly
var httpClientBuilder = services.AddHttpClient(remoteServiceConfigurationName);
if (configureHttpClientBuilder == null)
{
httpClientBuilder.AddTransientHttpErrorPolicy(builder =>
// retry 3 times
builder.WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(Math.Pow(2, i))));
}
else
{
configureHttpClientBuilder.Invoke(httpClientBuilder);
}
var interceptorType = typeof(DynamicHttpProxyInterceptor<>).MakeGenericType(type); var interceptorType = typeof(DynamicHttpProxyInterceptor<>).MakeGenericType(type);
services.AddTransient(interceptorType); services.AddTransient(interceptorType);

Loading…
Cancel
Save