From 34ada95ac0285731d49bfc3e286370d3dacf5991 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Fri, 29 May 2020 18:14:52 +0800 Subject: [PATCH] Use remote service http client in ApiDescriptionFinder. Related #4062, This allows us to configure named remote service http client. --- .../DynamicProxying/ApiDescriptionFinder.cs | 51 ++++++++----------- .../DynamicHttpProxyInterceptor.cs | 6 +-- .../DynamicProxying/IApiDescriptionFinder.cs | 7 +-- 3 files changed, 29 insertions(+), 35 deletions(-) diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs index 2e8eb41844..a9b51eca6a 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Net.Http; using System.Reflection; using System.Threading.Tasks; using Newtonsoft.Json; @@ -14,8 +15,6 @@ namespace Volo.Abp.Http.Client.DynamicProxying { public ICancellationTokenProvider CancellationTokenProvider { get; set; } - protected IDynamicProxyHttpClientFactory HttpClientFactory { get; } - protected IApiDescriptionCache Cache { get; } private static readonly JsonSerializerSettings SharedJsonSerializerSettings = new JsonSerializerSettings @@ -23,18 +22,15 @@ namespace Volo.Abp.Http.Client.DynamicProxying ContractResolver = new CamelCasePropertyNamesContractResolver() }; - public ApiDescriptionFinder( - IApiDescriptionCache cache, - IDynamicProxyHttpClientFactory httpClientFactory) + public ApiDescriptionFinder(IApiDescriptionCache cache) { Cache = cache; - HttpClientFactory = httpClientFactory; CancellationTokenProvider = NullCancellationTokenProvider.Instance; } - public async Task FindActionAsync(string baseUrl, Type serviceType, MethodInfo method) + public async Task FindActionAsync(HttpClient client, string baseUrl, Type serviceType, MethodInfo method) { - var apiDescription = await GetApiDescriptionAsync(baseUrl); + var apiDescription = await GetApiDescriptionAsync(client, baseUrl); //TODO: Cache finding? @@ -56,8 +52,8 @@ namespace Volo.Abp.Http.Client.DynamicProxying var found = true; for (int i = 0; i < methodParameters.Length; i++) - { - if (!TypeMatches(action.ParametersOnMethod[i], methodParameters[i])) + { + if (!TypeMatches(action.ParametersOnMethod[i], methodParameters[i])) { found = false; break; @@ -76,33 +72,30 @@ namespace Volo.Abp.Http.Client.DynamicProxying throw new AbpException($"Could not found remote action for method: {method} on the URL: {baseUrl}"); } - public virtual async Task GetApiDescriptionAsync(string baseUrl) + public virtual async Task GetApiDescriptionAsync(HttpClient client, string baseUrl) { - return await Cache.GetAsync(baseUrl, () => GetApiDescriptionFromServerAsync(baseUrl)); + return await Cache.GetAsync(baseUrl, () => GetApiDescriptionFromServerAsync(client, baseUrl)); } - protected virtual async Task GetApiDescriptionFromServerAsync(string baseUrl) + protected virtual async Task GetApiDescriptionFromServerAsync(HttpClient client, string baseUrl) { - using (var client = HttpClientFactory.Create()) - { - var response = await client.GetAsync( - baseUrl.EnsureEndsWith('/') + "api/abp/api-definition", - CancellationTokenProvider.Token - ); + var response = await client.GetAsync( + baseUrl.EnsureEndsWith('/') + "api/abp/api-definition", + CancellationTokenProvider.Token + ); - if (!response.IsSuccessStatusCode) - { - throw new AbpException("Remote service returns error! StatusCode = " + response.StatusCode); - } + if (!response.IsSuccessStatusCode) + { + throw new AbpException("Remote service returns error! StatusCode = " + response.StatusCode); + } - var content = await response.Content.ReadAsStringAsync(); + var content = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject( - content, - typeof(ApplicationApiDescriptionModel), SharedJsonSerializerSettings); + var result = JsonConvert.DeserializeObject( + content, + typeof(ApplicationApiDescriptionModel), SharedJsonSerializerSettings); - return (ApplicationApiDescriptionModel)result; - } + return (ApplicationApiDescriptionModel)result; } protected virtual bool TypeMatches(MethodParameterApiDescriptionModel actionParameter, ParameterInfo methodParameter) diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs index 031ea7d99b..533b76aa6c 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs @@ -106,7 +106,7 @@ namespace Volo.Abp.Http.Client.DynamicProxying private async Task MakeRequestAndGetResultAsync(IAbpMethodInvocation invocation) { var responseAsString = await MakeRequestAsync(invocation); - + if (typeof(T) == typeof(string)) { return (T)Convert.ChangeType(responseAsString, typeof(T)); @@ -122,7 +122,7 @@ namespace Volo.Abp.Http.Client.DynamicProxying var client = HttpClientFactory.Create(clientConfig.RemoteServiceName); - var action = await ApiDescriptionFinder.FindActionAsync(remoteServiceConfig.BaseUrl, typeof(TService), invocation.Method); + var action = await ApiDescriptionFinder.FindActionAsync(client, remoteServiceConfig.BaseUrl, typeof(TService), invocation.Method); var apiVersion = GetApiVersionInfo(action); var url = remoteServiceConfig.BaseUrl.EnsureEndsWith('/') + UrlBuilder.GenerateUrlWithParameters(action, invocation.ArgumentsDictionary, apiVersion); @@ -252,4 +252,4 @@ namespace Volo.Abp.Http.Client.DynamicProxying return CancellationTokenProvider.Token; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApiDescriptionFinder.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApiDescriptionFinder.cs index 010d55706e..e957752330 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApiDescriptionFinder.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApiDescriptionFinder.cs @@ -1,4 +1,5 @@ using System; +using System.Net.Http; using System.Reflection; using System.Threading.Tasks; using Volo.Abp.Http.Modeling; @@ -7,8 +8,8 @@ namespace Volo.Abp.Http.Client.DynamicProxying { public interface IApiDescriptionFinder { - Task FindActionAsync(string baseUrl, Type serviceType, MethodInfo invocationMethod); + Task FindActionAsync(HttpClient client, string baseUrl, Type serviceType, MethodInfo invocationMethod); - Task GetApiDescriptionAsync(string baseUrl); + Task GetApiDescriptionAsync(HttpClient client, string baseUrl); } -} \ No newline at end of file +}