Browse Source

Move `ExecuteHttpAction` to `AbpHttpClientOptions` and fix the unit test.

pull/21213/head
maliming 2 years ago
parent
commit
ef871a44b6
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 12
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientExecuteHttpActionOptions.cs
  2. 5
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs
  3. 11
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs
  4. 13
      framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpClientTestModule.cs
  5. 4
      framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestController.cs
  6. 10
      framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs

12
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientExecuteHttpActionOptions.cs

@ -1,12 +0,0 @@
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Reflection;
using System.Text;
using Volo.Abp.Http.Modeling;
namespace Volo.Abp.Http.Client;
public class AbpHttpClientExecuteHttpActionOptions
{
public Action<ActionApiDescriptionModel, HttpClient>? ExecuteHttpAction{ get; set; }
}

5
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs

@ -1,5 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Net.Http;
using Volo.Abp.Http.Client.ClientProxying;
using Volo.Abp.Http.Client.Proxying; using Volo.Abp.Http.Client.Proxying;
namespace Volo.Abp.Http.Client; namespace Volo.Abp.Http.Client;
@ -8,8 +10,11 @@ public class AbpHttpClientOptions
{ {
public Dictionary<Type, HttpClientProxyConfig> HttpClientProxies { get; set; } public Dictionary<Type, HttpClientProxyConfig> HttpClientProxies { get; set; }
public Dictionary<string, Action<HttpClientProxyConfig, ClientProxyRequestContext, HttpClient>> ProxyHttpClientPreSendActions { get; }
public AbpHttpClientOptions() public AbpHttpClientOptions()
{ {
HttpClientProxies = new Dictionary<Type, HttpClientProxyConfig>(); HttpClientProxies = new Dictionary<Type, HttpClientProxyConfig>();
ProxyHttpClientPreSendActions = new Dictionary<string, Action<HttpClientProxyConfig, ClientProxyRequestContext, HttpClient>>();
} }
} }

11
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs

@ -7,7 +7,6 @@ using System.Net.Http.Headers;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Castle.DynamicProxy;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Microsoft.Extensions.Primitives; using Microsoft.Extensions.Primitives;
using Volo.Abp.Content; using Volo.Abp.Content;
@ -44,8 +43,6 @@ public class ClientProxyBase<TService> : ITransientDependency
protected ICurrentApiVersionInfo CurrentApiVersionInfo => LazyServiceProvider.LazyGetRequiredService<ICurrentApiVersionInfo>(); protected ICurrentApiVersionInfo CurrentApiVersionInfo => LazyServiceProvider.LazyGetRequiredService<ICurrentApiVersionInfo>();
protected ILocalEventBus LocalEventBus => LazyServiceProvider.LazyGetRequiredService<ILocalEventBus>(); protected ILocalEventBus LocalEventBus => LazyServiceProvider.LazyGetRequiredService<ILocalEventBus>();
protected IOptions<AbpHttpClientExecuteHttpActionOptions> ExecuteHttpActionOptions => LazyServiceProvider.LazyGetRequiredService<IOptions<AbpHttpClientExecuteHttpActionOptions>>();
protected virtual async Task RequestAsync(string methodName, ClientProxyRequestTypeValue? arguments = null) protected virtual async Task RequestAsync(string methodName, ClientProxyRequestTypeValue? arguments = null)
{ {
await RequestAsync(BuildHttpProxyClientProxyContext(methodName, arguments)); await RequestAsync(BuildHttpProxyClientProxyContext(methodName, arguments));
@ -148,9 +145,11 @@ public class ClientProxyBase<TService> : ITransientDependency
HttpResponseMessage response; HttpResponseMessage response;
try try
{ {
//Allows users to customize the timeout for remote methods of specific requests foreach (var preSendAction in ClientOptions.Value.ProxyHttpClientPreSendActions.Where(x => x.Key == clientConfig.RemoteServiceName).Select(x => x.Value))
ExecuteHttpActionOptions.Value.ExecuteHttpAction?.Invoke(requestContext.Action, client); {
preSendAction(clientConfig, requestContext, client);
}
response = await client.SendAsync( response = await client.SendAsync(
requestMessage, requestMessage,

13
framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpClientTestModule.cs

@ -62,16 +62,15 @@ public class AbpHttpClientTestModule : AbpModule
options.PathConverts.Add(typeof(int), typeof(TestObjectToPath)); options.PathConverts.Add(typeof(int), typeof(TestObjectToPath));
}); });
Configure<AbpHttpClientExecuteHttpActionOptions>(options => Configure<AbpHttpClientOptions>(options =>
{ {
options.ExecuteHttpAction = (method, httpclient) => options.ProxyHttpClientPreSendActions.Add("Default", (_, requestContext, httpclient) =>
{ {
if (method.Name.Equals("TimeOutRequestAsync")) if (requestContext.Action.Name.Equals("TimeOutRequestAsync"))
{ {
httpclient.Timeout = TimeSpan.FromMilliseconds(2000); httpclient.Timeout = TimeSpan.FromMilliseconds(1);
} }
}; });
}); });
} }
} }

4
framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestController.cs

@ -157,8 +157,8 @@ public class RegularTestController : AbpController, IRegularTestController
[Route("timeout-request")] [Route("timeout-request")]
public async Task<string> TimeOutRequestAsync() public async Task<string> TimeOutRequestAsync()
{ {
await Task.Delay(5000); await Task.Delay(100);
return "timeout-request"; return "TimeOutRequestAsync";
} }
} }

10
framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs

@ -1,4 +1,5 @@
using System; using System;
using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -191,12 +192,7 @@ public class RegularTestControllerClientProxy_Tests : AbpHttpClientTestBase
[Fact] [Fact]
public async Task TimeOutRequestAsync() public async Task TimeOutRequestAsync()
{ {
//This cannot be executed successfully because the unit test does not use SocketsHttpHandler for request processing, var exception = await Assert.ThrowsAsync<HttpRequestException>(async () => await _controller.TimeOutRequestAsync());
//so the desired results cannot be obtained locally. At the same time, exception.InnerException.InnerException.Message.ShouldBe("The client aborted the request.");
//I can achieve the expected results by using other services locally.
//var exception = await Assert.ThrowsAsync<TaskCanceledException>(async () => await _controller.TimeOutRequestAsync());
//exception.InnerException.InnerException.InnerException.Message.ShouldBe("The client aborted the request.");
await Task.CompletedTask;
} }
} }

Loading…
Cancel
Save