diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingInterceptor.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingInterceptor.cs index 6be28d24cf..0f8894ed10 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingInterceptor.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingInterceptor.cs @@ -191,7 +191,9 @@ public class AuditingInterceptor : AbpInterceptor, ITransientDependency } if (!options.IsEnabledForGetRequests && - invocation.Method.Name.StartsWith("Get", StringComparison.OrdinalIgnoreCase)) + (string.Equals(auditLogInfo.HttpMethod, "Get", StringComparison.OrdinalIgnoreCase) || + string.Equals(auditLogInfo.HttpMethod, "Head", StringComparison.OrdinalIgnoreCase) || + invocation.Method.Name.StartsWith("Get", StringComparison.OrdinalIgnoreCase))) { return false; } diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs index 72a20748c6..96a11f928e 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs @@ -132,7 +132,13 @@ public abstract class DistributedEventBusBase : EventBusBase, IDistributedEventB Serialize(eventData), Clock.Now ); - outgoingEventInfo.SetCorrelationId(CorrelationIdProvider.Get()!); + + var correlationId = CorrelationIdProvider.Get(); + if (correlationId != null) + { + outgoingEventInfo.SetCorrelationId(correlationId); + } + await eventOutbox.EnqueueAsync(outgoingEventInfo); return true; } diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs index 6743ab5174..bfe52508e4 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs +++ b/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,17 @@ public class AbpHttpClientOptions { public Dictionary HttpClientProxies { get; set; } + public Dictionary>> ProxyHttpClientPreSendActions { get; } + public AbpHttpClientOptions() { HttpClientProxies = new Dictionary(); + ProxyHttpClientPreSendActions = new Dictionary>>(); + } + + public AbpHttpClientOptions AddPreSendAction(string remoteServiceName, Action action) + { + ProxyHttpClientPreSendActions.GetOrAdd(remoteServiceName, () => new List>()).Add(action); + return this; } } 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 a4306050a4..01c1e2a720 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 @@ -146,6 +146,11 @@ public class ClientProxyBase : ITransientDependency HttpResponseMessage response; try { + foreach (var preSendAction in ClientOptions.Value.ProxyHttpClientPreSendActions.Where(x => x.Key == clientConfig.RemoteServiceName).SelectMany(x => x.Value)) + { + preSendAction(clientConfig, requestContext, client); + } + response = await client.SendAsync( requestMessage, HttpCompletionOption.ResponseHeadersRead /*this will buffer only the headers, the content will be used as a stream*/, @@ -309,7 +314,11 @@ public class ClientProxyBase : ITransientDependency } //CorrelationId - requestMessage.Headers.Add(AbpCorrelationIdOptions.Value.HttpHeaderName, CorrelationIdProvider.Get()); + var correlationId = CorrelationIdProvider.Get(); + if (correlationId != null) + { + requestMessage.Headers.Add(AbpCorrelationIdOptions.Value.HttpHeaderName, correlationId); + } //TenantId if (CurrentTenant.Id.HasValue) 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 10089c52cd..e54e24ced0 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 @@ -126,7 +126,11 @@ public class ApiDescriptionFinder : IApiDescriptionFinder, ITransientDependency protected virtual void AddHeaders(HttpRequestMessage requestMessage) { //CorrelationId - requestMessage.Headers.Add(AbpCorrelationIdOptions.HttpHeaderName, CorrelationIdProvider.Get()); + var correlationId = CorrelationIdProvider.Get(); + if (correlationId != null) + { + requestMessage.Headers.Add(AbpCorrelationIdOptions.HttpHeaderName, correlationId); + } //TenantId if (CurrentTenant.Id.HasValue) diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpClientTestModule.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpClientTestModule.cs index 5e9107a23b..4dd69041fc 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpClientTestModule.cs +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpClientTestModule.cs @@ -1,8 +1,11 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Net.Http; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.Http.Client; using Volo.Abp.Http.Client.ClientProxying; +using Volo.Abp.Http.Client.Proxying; using Volo.Abp.Http.DynamicProxying; using Volo.Abp.Http.Localization; using Volo.Abp.Localization; @@ -60,5 +63,16 @@ public class AbpHttpClientTestModule : AbpModule options.FormDataConverts.Add(typeof(List), typeof(TestObjectToFormData)); options.PathConverts.Add(typeof(int), typeof(TestObjectToPath)); }); + + Configure(options => + { + options.AddPreSendAction("Default", (_, requestContext, httpclient) => + { + if (requestContext.Action.Name.Equals("TimeOutRequestAsync")) + { + httpclient.Timeout = TimeSpan.FromMilliseconds(1); + } + }); + }); } } diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/IRegularTestController.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/IRegularTestController.cs index 547f1bf5a7..21786155bf 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/IRegularTestController.cs +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/IRegularTestController.cs @@ -43,4 +43,7 @@ public interface IRegularTestController Task DeleteByIdAsync(int id); Task AbortRequestAsync(CancellationToken cancellationToken = default); + + Task TimeOutRequestAsync(); + } diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestController.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestController.cs index b092e67bc8..46b355090b 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestController.cs +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestController.cs @@ -152,6 +152,14 @@ public class RegularTestController : AbpController, IRegularTestController await Task.Delay(100, cancellationToken); return "AbortRequestAsync"; } + + [HttpGet] + [Route("timeout-request")] + public async Task TimeOutRequestAsync() + { + await Task.Delay(100); + return "TimeOutRequestAsync"; + } } public class Car 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 f094c756a9..01ec97d734 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 @@ -1,4 +1,5 @@ using System; +using System.Net.Http; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -187,4 +188,11 @@ public class RegularTestControllerClientProxy_Tests : AbpHttpClientTestBase var exception = await Assert.ThrowsAsync(async () => await _controller.AbortRequestAsync(cts.Token)); exception.InnerException.InnerException.InnerException.Message.ShouldBe("The client aborted the request."); } + + [Fact] + public async Task TimeOutRequestAsync() + { + var exception = await Assert.ThrowsAsync(async () => await _controller.TimeOutRequestAsync()); + exception.InnerException.InnerException.Message.ShouldBe("The client aborted the request."); + } }