From cc3fc18adbbbd508f1741869088be54dff9cedf1 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 29 Jul 2021 10:05:54 +0800 Subject: [PATCH 1/2] Use `CancellationToken` if it exists in the parameter. --- .../DynamicProxying/DynamicHttpProxyInterceptor.cs | 7 ++++--- .../Http/DynamicProxying/IRegularTestController.cs | 3 +++ .../Http/DynamicProxying/RegularTestController.cs | 10 ++++++++-- .../RegularTestControllerClientProxy_Tests.cs | 13 +++++++++++-- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs index b94a5a339d..b045e4bebd 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs @@ -174,7 +174,7 @@ namespace Volo.Abp.Http.Client.DynamicProxying var response = await client.SendAsync( requestMessage, HttpCompletionOption.ResponseHeadersRead /*this will buffer only the headers, the content will be used as a stream*/, - GetCancellationToken() + GetCancellationToken(invocation) ); if (!response.IsSuccessStatusCode) @@ -306,9 +306,10 @@ namespace Volo.Abp.Http.Client.DynamicProxying return input; } - protected virtual CancellationToken GetCancellationToken() + protected virtual CancellationToken GetCancellationToken(IAbpMethodInvocation invocation) { - return CancellationTokenProvider.Token; + var cancellationToken = invocation.Arguments.LastOrDefault(x => x is CancellationToken); + return (CancellationToken?)cancellationToken ?? CancellationTokenProvider.Token; } } } 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 23694e4e72..15419539a2 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 @@ -1,4 +1,5 @@ using System; +using System.Threading; using System.Threading.Tasks; namespace Volo.Abp.Http.DynamicProxying @@ -36,5 +37,7 @@ namespace Volo.Abp.Http.DynamicProxying Task PatchValueWithHeaderAndQueryStringAsync(string headerValue, string qsValue); Task DeleteByIdAsync(int id); + + Task AbortRequestAsync(CancellationToken cancellationToken); } } 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 e18c2f8f4a..cfd13158f1 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 @@ -1,11 +1,10 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Volo.Abp.Application.Services; using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.UI; namespace Volo.Abp.Http.DynamicProxying { @@ -129,6 +128,13 @@ namespace Volo.Abp.Http.DynamicProxying { return Task.FromResult(id + 1); } + + [HttpGet] + [Route("abort-request")] + public async Task AbortRequestAsync(CancellationToken cancellationToken) + { + await Task.Delay(100, cancellationToken); + } } 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 bd35016989..bc179193a2 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,10 +1,10 @@ using System; +using System.Net.Http; +using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Localization; using Shouldly; using Volo.Abp.Http.Client; -using Volo.Abp.Http.Localization; using Volo.Abp.Localization; using Xunit; @@ -159,5 +159,14 @@ namespace Volo.Abp.Http.DynamicProxying (await _controller.DeleteByIdAsync(42)).ShouldBe(43); } + [Fact] + public async Task AbortRequestAsync() + { + var cts = new CancellationTokenSource(); + cts.CancelAfter(10); + + var exception = await Assert.ThrowsAsync(async () => await _controller.AbortRequestAsync(cts.Token)); + exception.InnerException.InnerException.Message.ShouldBe("The client aborted the request."); + } } } From a5dc1681fe319dccfbc067adc2dd081ad662ab10 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 29 Jul 2021 10:26:35 +0800 Subject: [PATCH 2/2] Skip the default CancellationToken. --- .../DynamicProxying/DynamicHttpProxyInterceptor.cs | 13 +++++++++++-- .../Http/DynamicProxying/IRegularTestController.cs | 2 +- .../Http/DynamicProxying/RegularTestController.cs | 3 ++- .../RegularTestControllerClientProxy_Tests.cs | 3 +++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs index b045e4bebd..df890812bb 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs @@ -308,8 +308,17 @@ namespace Volo.Abp.Http.Client.DynamicProxying protected virtual CancellationToken GetCancellationToken(IAbpMethodInvocation invocation) { - var cancellationToken = invocation.Arguments.LastOrDefault(x => x is CancellationToken); - return (CancellationToken?)cancellationToken ?? CancellationTokenProvider.Token; + var cancellationTokenArg = invocation.Arguments.LastOrDefault(x => x is CancellationToken); + if (cancellationTokenArg != null) + { + var cancellationToken = (CancellationToken) cancellationTokenArg; + if (cancellationToken != default) + { + return cancellationToken; + } + } + + return CancellationTokenProvider.Token; } } } 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 15419539a2..d1c1275db7 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 @@ -38,6 +38,6 @@ namespace Volo.Abp.Http.DynamicProxying Task DeleteByIdAsync(int id); - Task AbortRequestAsync(CancellationToken cancellationToken); + Task AbortRequestAsync(CancellationToken cancellationToken = default); } } 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 cfd13158f1..782b839626 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 @@ -131,9 +131,10 @@ namespace Volo.Abp.Http.DynamicProxying [HttpGet] [Route("abort-request")] - public async Task AbortRequestAsync(CancellationToken cancellationToken) + public async Task AbortRequestAsync(CancellationToken cancellationToken = default) { await Task.Delay(100, cancellationToken); + return "AbortRequestAsync"; } } 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 bc179193a2..8df3e94b3c 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 @@ -165,6 +165,9 @@ namespace Volo.Abp.Http.DynamicProxying var cts = new CancellationTokenSource(); cts.CancelAfter(10); + 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."); }