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.Collections.Generic;
using System.Net.Http;
using Volo.Abp.Http.Client.ClientProxying;
using Volo.Abp.Http.Client.Proxying;
namespace Volo.Abp.Http.Client;
@ -8,8 +10,11 @@ public class AbpHttpClientOptions
{
public Dictionary<Type, HttpClientProxyConfig> HttpClientProxies { get; set; }
public Dictionary<string, Action<HttpClientProxyConfig, ClientProxyRequestContext, HttpClient>> ProxyHttpClientPreSendActions { get; }
public AbpHttpClientOptions()
{
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.Threading;
using System.Threading.Tasks;
using Castle.DynamicProxy;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.Primitives;
using Volo.Abp.Content;
@ -44,8 +43,6 @@ public class ClientProxyBase<TService> : ITransientDependency
protected ICurrentApiVersionInfo CurrentApiVersionInfo => LazyServiceProvider.LazyGetRequiredService<ICurrentApiVersionInfo>();
protected ILocalEventBus LocalEventBus => LazyServiceProvider.LazyGetRequiredService<ILocalEventBus>();
protected IOptions<AbpHttpClientExecuteHttpActionOptions> ExecuteHttpActionOptions => LazyServiceProvider.LazyGetRequiredService<IOptions<AbpHttpClientExecuteHttpActionOptions>>();
protected virtual async Task RequestAsync(string methodName, ClientProxyRequestTypeValue? arguments = null)
{
await RequestAsync(BuildHttpProxyClientProxyContext(methodName, arguments));
@ -148,9 +145,11 @@ public class ClientProxyBase<TService> : ITransientDependency
HttpResponseMessage response;
try
{
//Allows users to customize the timeout for remote methods of specific requests
ExecuteHttpActionOptions.Value.ExecuteHttpAction?.Invoke(requestContext.Action, client);
{
foreach (var preSendAction in ClientOptions.Value.ProxyHttpClientPreSendActions.Where(x => x.Key == clientConfig.RemoteServiceName).Select(x => x.Value))
{
preSendAction(clientConfig, requestContext, client);
}
response = await client.SendAsync(
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));
});
Configure<AbpHttpClientExecuteHttpActionOptions>(options =>
Configure<AbpHttpClientOptions>(options =>
{
options.ExecuteHttpAction = (method, httpclient) =>
options.ProxyHttpClientPreSendActions.Add("Default", (_, requestContext, httpclient) =>
{
if (method.Name.Equals("TimeOutRequestAsync"))
{
httpclient.Timeout = TimeSpan.FromMilliseconds(2000);
if (requestContext.Action.Name.Equals("TimeOutRequestAsync"))
{
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")]
public async Task<string> TimeOutRequestAsync()
{
await Task.Delay(5000);
return "timeout-request";
await Task.Delay(100);
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.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
@ -191,12 +192,7 @@ public class RegularTestControllerClientProxy_Tests : AbpHttpClientTestBase
[Fact]
public async Task TimeOutRequestAsync()
{
//This cannot be executed successfully because the unit test does not use SocketsHttpHandler for request processing,
//so the desired results cannot be obtained locally. At the same time,
//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;
var exception = await Assert.ThrowsAsync<HttpRequestException>(async () => await _controller.TimeOutRequestAsync());
exception.InnerException.InnerException.Message.ShouldBe("The client aborted the request.");
}
}

Loading…
Cancel
Save