From 00838921530e6e1369163eab22b74e6c6a4cb7ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 16 Sep 2017 10:39:59 +0300 Subject: [PATCH] Improved DynamicHttpProxyInterceptor --- .../DynamicHttpProxyInterceptor.cs | 47 ++++++++++++------- .../AspNetCore/Mvc/PersonAppService_Tests.cs | 1 + .../PersonAppServiceClientProxy_Tests.cs | 5 +- .../{ => Dto}/GetPersonPhonesFilter.cs | 2 +- .../Dto/GetWithComplexTypeInput.cs | 20 ++++++++ .../Application/{ => Dto}/PersonDto.cs | 2 +- .../TestApp/Application/{ => Dto}/PhoneDto.cs | 2 +- .../TestApp/Application/IPeopleAppService.cs | 19 +------- .../TestApp/Application/PeopleAppService.cs | 1 + .../Volo/Abp/TestApp/TestAppModule.cs | 1 + 10 files changed, 60 insertions(+), 40 deletions(-) rename test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/{ => Dto}/GetPersonPhonesFilter.cs (75%) create mode 100644 test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/Dto/GetWithComplexTypeInput.cs rename test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/{ => Dto}/PersonDto.cs (79%) rename test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/{ => Dto}/PhoneDto.cs (82%) diff --git a/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs b/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs index 5bc5981469..01f90d474c 100644 --- a/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs +++ b/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs @@ -12,6 +12,8 @@ using Volo.Abp.Threading; namespace Volo.Abp.Http.Client.DynamicProxying { + //TODO: Somehow capture cancellationtoken and pass to other methods...? + public class DynamicHttpProxyInterceptor : AbpInterceptor, ITransientDependency { private static MethodInfo GenericInterceptAsyncMethod { get; } @@ -39,47 +41,58 @@ namespace Volo.Abp.Http.Client.DynamicProxying public override void Intercept(IAbpMethodInvocation invocation) { + //TODO: Handle this differently because InterceptAsync assumes that given method is async! + AsyncHelper.RunSync(() => InterceptAsync(invocation)); } public override Task InterceptAsync(IAbpMethodInvocation invocation) { + if (invocation.Method.ReturnType.GenericTypeArguments.IsNullOrEmpty()) + { + return MakeRequest(invocation); + } + invocation.ReturnValue = GenericInterceptAsyncMethod .MakeGenericMethod(invocation.Method.ReturnType.GenericTypeArguments[0]) - .Invoke(this, new object[] { invocation }); + .Invoke(this, new object[] {invocation}); return Task.CompletedTask; } private async Task InterceptAsync(IAbpMethodInvocation invocation) { - //TODO: Somehow capture cancellationtoken and pass to other methods...? + var content = await MakeRequest(invocation); + + var result = JsonConvert.DeserializeObject( + content, + typeof(T), + new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver() + }); - var proxyConfig = GetProxyConfig(); - var actionApiDescription = await _apiDescriptionFinder.FindActionAsync(proxyConfig, invocation.Method); + return (T)result; + } + private async Task MakeRequest(IAbpMethodInvocation invocation) + { using (var client = _httpClientFactory.Create()) { - var url = proxyConfig.BaseUrl + UrlBuilder.GenerateUrlWithParameters(actionApiDescription, invocation.ArgumentsDictionary); + var proxyConfig = GetProxyConfig(); + var actionApiDescription = await _apiDescriptionFinder.FindActionAsync(proxyConfig, invocation.Method); + var url = proxyConfig.BaseUrl + UrlBuilder.GenerateUrlWithParameters(actionApiDescription, invocation.ArgumentsDictionary); var requestMessage = new HttpRequestMessage(actionApiDescription.GetHttpMethod(), url); + var response = await client.SendAsync(requestMessage); + if (!response.IsSuccessStatusCode) { - throw new AbpException("Remote service returns error!"); + throw new AbpException($"Remote service returns error! HttpStatusCode: {response.StatusCode}, ReasonPhrase: {response.ReasonPhrase}"); } - var content = await response.Content.ReadAsStringAsync(); - - var result = JsonConvert.DeserializeObject( - content, - typeof(T), - new JsonSerializerSettings - { - ContractResolver = new CamelCasePropertyNamesContractResolver() - }); - - return (T)result; + return await response.Content.ReadAsStringAsync(); } } diff --git a/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/PersonAppService_Tests.cs b/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/PersonAppService_Tests.cs index f4a9860834..445e226de4 100644 --- a/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/PersonAppService_Tests.cs +++ b/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/PersonAppService_Tests.cs @@ -13,6 +13,7 @@ using System.Net.Http; using System.Text; using Volo.Abp.ObjectMapping; using Volo.Abp.Json; +using Volo.Abp.TestApp.Application.Dto; namespace Volo.Abp.AspNetCore.Mvc { diff --git a/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/PersonAppServiceClientProxy_Tests.cs b/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/PersonAppServiceClientProxy_Tests.cs index ee269a6000..093326b436 100644 --- a/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/PersonAppServiceClientProxy_Tests.cs +++ b/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/PersonAppServiceClientProxy_Tests.cs @@ -5,6 +5,7 @@ using Shouldly; using Volo.Abp.Application.Dtos; using Volo.Abp.Domain.Repositories; using Volo.Abp.TestApp.Application; +using Volo.Abp.TestApp.Application.Dto; using Volo.Abp.TestApp.Domain; using Xunit; @@ -47,10 +48,10 @@ namespace Volo.Abp.Http.DynamicProxying new GetWithComplexTypeInput { Value1 = "value one", - Inner1 = new GetWithComplexTypeInner + Inner1 = new GetWithComplexTypeInput.GetWithComplexTypeInner { Value2 = "value two", - Inner2 = new GetWithComplexTypeInnerInner + Inner2 = new GetWithComplexTypeInput.GetWithComplexTypeInnerInner { Value3 = "value three" } diff --git a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/GetPersonPhonesFilter.cs b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/Dto/GetPersonPhonesFilter.cs similarity index 75% rename from test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/GetPersonPhonesFilter.cs rename to test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/Dto/GetPersonPhonesFilter.cs index 8df4220888..19db3c8e06 100644 --- a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/GetPersonPhonesFilter.cs +++ b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/Dto/GetPersonPhonesFilter.cs @@ -1,6 +1,6 @@ using Volo.Abp.TestApp.Domain; -namespace Volo.Abp.TestApp.Application +namespace Volo.Abp.TestApp.Application.Dto { public class GetPersonPhonesFilter { diff --git a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/Dto/GetWithComplexTypeInput.cs b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/Dto/GetWithComplexTypeInput.cs new file mode 100644 index 0000000000..8c410ae5d8 --- /dev/null +++ b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/Dto/GetWithComplexTypeInput.cs @@ -0,0 +1,20 @@ +namespace Volo.Abp.TestApp.Application.Dto +{ + public class GetWithComplexTypeInput + { + public string Value1 { get; set; } + + public GetWithComplexTypeInner Inner1 { get; set; } + + public class GetWithComplexTypeInner + { + public string Value2 { get; set; } + public GetWithComplexTypeInnerInner Inner2 { get; set; } + } + + public class GetWithComplexTypeInnerInner + { + public string Value3 { get; set; } + } + } +} \ No newline at end of file diff --git a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PersonDto.cs b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/Dto/PersonDto.cs similarity index 79% rename from test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PersonDto.cs rename to test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/Dto/PersonDto.cs index c894860275..7075c0c3c9 100644 --- a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PersonDto.cs +++ b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/Dto/PersonDto.cs @@ -1,6 +1,6 @@ using Volo.Abp.Application.Dtos; -namespace Volo.Abp.TestApp.Application +namespace Volo.Abp.TestApp.Application.Dto { public class PersonDto : EntityDto { diff --git a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PhoneDto.cs b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/Dto/PhoneDto.cs similarity index 82% rename from test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PhoneDto.cs rename to test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/Dto/PhoneDto.cs index 273a6a53fc..203d4f5054 100644 --- a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PhoneDto.cs +++ b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/Dto/PhoneDto.cs @@ -1,7 +1,7 @@ using Volo.Abp.Application.Dtos; using Volo.Abp.TestApp.Domain; -namespace Volo.Abp.TestApp.Application +namespace Volo.Abp.TestApp.Application.Dto { public class PhoneDto : EntityDto { diff --git a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/IPeopleAppService.cs b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/IPeopleAppService.cs index 58089ca49e..9a0188d96d 100644 --- a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/IPeopleAppService.cs +++ b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/IPeopleAppService.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; +using Volo.Abp.TestApp.Application.Dto; namespace Volo.Abp.TestApp.Application { @@ -15,22 +16,4 @@ namespace Volo.Abp.TestApp.Application Task GetWithComplexType(GetWithComplexTypeInput input); } - - public class GetWithComplexTypeInput - { - public string Value1 { get; set; } - - public GetWithComplexTypeInner Inner1 { get; set; } - } - - public class GetWithComplexTypeInner - { - public string Value2 { get; set; } - public GetWithComplexTypeInnerInner Inner2 { get; set; } - } - - public class GetWithComplexTypeInnerInner - { - public string Value3 { get; set; } - } } \ No newline at end of file diff --git a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs index 61f49deb73..0561f6fcef 100644 --- a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs +++ b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs @@ -6,6 +6,7 @@ using Volo.Abp.Application.Dtos; using Volo.Abp.TestApp.Domain; using Volo.Abp.Domain.Repositories; using Volo.Abp.Application.Services; +using Volo.Abp.TestApp.Application.Dto; namespace Volo.Abp.TestApp.Application { diff --git a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs index 2eca793dc1..4b5a86623d 100644 --- a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs +++ b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs @@ -3,6 +3,7 @@ using Volo.Abp.Modularity; using Volo.Abp.TestApp.Domain; using Volo.Abp.AutoMapper; using Volo.Abp.TestApp.Application; +using Volo.Abp.TestApp.Application.Dto; namespace Volo.Abp.TestApp {