From 8b629468eea8c3a8e5def53fe6b1cf5aa5d1960a Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 21 Oct 2021 14:10:28 +0800 Subject: [PATCH] Add `RegularTestControllerClientProxy_AbpRemoteCallException_Tests` --- .../DefaultExceptionToErrorInfoConverter.cs | 6 +- .../Abp/Http/Client/AbpRemoteCallException.cs | 4 +- .../Client/ClientProxying/ClientProxyBase.cs | 52 +++++++++++----- ...lientProxy_AbpRemoteCallException_Tests.cs | 61 +++++++++++++++++++ .../RegularTestControllerClientProxy_Tests.cs | 4 +- 5 files changed, 105 insertions(+), 22 deletions(-) create mode 100644 framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_AbpRemoteCallException_Tests.cs diff --git a/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/AspNetCore/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs b/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/AspNetCore/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs index abe0f3ab84..16fae96db6 100644 --- a/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/AspNetCore/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs +++ b/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/AspNetCore/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs @@ -59,9 +59,9 @@ namespace Volo.Abp.AspNetCore.ExceptionHandling exception = TryToGetActualException(exception); - if (exception is AbpRemoteCallException remoteCallException) + if (exception is AbpRemoteCallException remoteCallException && remoteCallException.Error != null) { - return remoteCallException.Error ?? new RemoteServiceErrorInfo(remoteCallException.Message); + return remoteCallException.Error; } if (exception is AbpDbConcurrencyException) @@ -76,7 +76,7 @@ namespace Volo.Abp.AspNetCore.ExceptionHandling var errorInfo = new RemoteServiceErrorInfo(); - if (exception is IUserFriendlyException) + if (exception is IUserFriendlyException || exception is AbpRemoteCallException) { errorInfo.Message = exception.Message; errorInfo.Details = (exception as IHasErrorDetails)?.Details; diff --git a/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/Http/Client/AbpRemoteCallException.cs b/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/Http/Client/AbpRemoteCallException.cs index 4feb2d2d82..43fb00b03a 100644 --- a/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/Http/Client/AbpRemoteCallException.cs +++ b/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/Http/Client/AbpRemoteCallException.cs @@ -33,8 +33,8 @@ namespace Volo.Abp.Http.Client } - public AbpRemoteCallException(RemoteServiceErrorInfo error) - : base(error.Message) + public AbpRemoteCallException(RemoteServiceErrorInfo error, Exception innerException = null) + : base(error.Message, innerException) { Error = error; diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs index a5da68b7b0..984a1aa3e1 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs @@ -6,6 +6,8 @@ using System.Net.Http; using System.Net.Http.Headers; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Microsoft.Extensions.Primitives; using Volo.Abp.Content; @@ -26,6 +28,7 @@ namespace Volo.Abp.Http.Client.ClientProxying { public IAbpLazyServiceProvider LazyServiceProvider { get; set; } + protected ILogger> Logger => LazyServiceProvider.LazyGetService>>(NullLogger>.Instance); protected IClientProxyApiDescriptionFinder ClientProxyApiDescriptionFinder => LazyServiceProvider.LazyGetRequiredService(); protected ICancellationTokenProvider CancellationTokenProvider => LazyServiceProvider.LazyGetRequiredService(); protected ICorrelationIdProvider CorrelationIdProvider => LazyServiceProvider.LazyGetRequiredService(); @@ -137,8 +140,7 @@ namespace Volo.Abp.Http.Client.ClientProxying { response = await client.SendAsync( requestMessage, - HttpCompletionOption - .ResponseHeadersRead /*this will buffer only the headers, the content will be used as a stream*/, + HttpCompletionOption.ResponseHeadersRead /*this will buffer only the headers, the content will be used as a stream*/, GetCancellationToken(requestContext.Arguments) ); } @@ -206,26 +208,46 @@ namespace Volo.Abp.Http.Client.ClientProxying { if (response.Headers.Contains(AbpHttpConsts.AbpErrorFormat)) { - var errorResponse = JsonSerializer.Deserialize( - await response.Content.ReadAsStringAsync() - ); + RemoteServiceErrorResponse errorResponse; + try + { + errorResponse = JsonSerializer.Deserialize( + await response.Content.ReadAsStringAsync() + ); + } + catch (Exception ex) + { + throw new AbpRemoteCallException( + new RemoteServiceErrorInfo + { + Message = response.ReasonPhrase, + Code = response.StatusCode.ToString() + }, + ex + ) + { + HttpStatusCode = (int)response.StatusCode + }; + } throw new AbpRemoteCallException(errorResponse.Error) { HttpStatusCode = (int) response.StatusCode }; } - - throw new AbpRemoteCallException( - new RemoteServiceErrorInfo - { - Message = response.ReasonPhrase, - Code = response.StatusCode.ToString() - } - ) + else { - HttpStatusCode = (int) response.StatusCode - }; + throw new AbpRemoteCallException( + new RemoteServiceErrorInfo + { + Message = response.ReasonPhrase, + Code = response.StatusCode.ToString() + } + ) + { + HttpStatusCode = (int) response.StatusCode + }; + } } protected virtual void AddHeaders( diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_AbpRemoteCallException_Tests.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_AbpRemoteCallException_Tests.cs new file mode 100644 index 0000000000..77f126cf5e --- /dev/null +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_AbpRemoteCallException_Tests.cs @@ -0,0 +1,61 @@ +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Hosting; +using Shouldly; +using Volo.Abp.AspNetCore.TestBase; +using Volo.Abp.Http.Client; +using Volo.Abp.Http.Client.Proxying; +using Xunit; + +namespace Volo.Abp.Http.DynamicProxying +{ + public class RegularTestControllerClientProxy_AbpRemoteCallException_Tests : AbpHttpClientTestBase + { + private readonly IRegularTestController _controller; + + public RegularTestControllerClientProxy_AbpRemoteCallException_Tests() + { + _controller = ServiceProvider.GetRequiredService(); + } + + protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) + { + services.Replace(ServiceDescriptor.Singleton()); + } + + [Fact] + public async Task AbpRemoteCallException_On_SendAsync_Test() + { + var exception = await Assert.ThrowsAsync(async () => await _controller.AbortRequestAsync(default)); + exception.Message.ShouldContain("An error occurred during the ABP remote HTTP request."); + } + + class TestProxyHttpClientFactory : IProxyHttpClientFactory + { + private readonly ITestServerAccessor _testServerAccessor; + + private int _count; + + public TestProxyHttpClientFactory(ITestServerAccessor testServerAccessor) + { + _testServerAccessor = testServerAccessor; + } + + public HttpClient Create(string name) => Create(); + + public HttpClient Create() + { + if (_count++ > 0) + { + //Will get an error on the SendAsync method. + return new HttpClient(); + } + + // for DynamicHttpProxyInterceptor.GetActionApiDescriptionModel + return _testServerAccessor.Server.CreateClient(); + } + } + } +} diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs index 8df3e94b3c..c1c46b298f 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs @@ -168,8 +168,8 @@ namespace Volo.Abp.Http.DynamicProxying var result = await _controller.AbortRequestAsync(default); result.ShouldBe("AbortRequestAsync"); - var exception = await Assert.ThrowsAsync(async () => await _controller.AbortRequestAsync(cts.Token)); - exception.InnerException.InnerException.Message.ShouldBe("The client aborted the request."); + var exception = await Assert.ThrowsAsync(async () => await _controller.AbortRequestAsync(cts.Token)); + exception.InnerException.InnerException.InnerException.Message.ShouldBe("The client aborted the request."); } } }