首页 > 解决方案 > 使用类型化的 HttpClient 创建 LinkedTokenSource

问题描述

您好,我想了解如何使用类型化(使用)扩展名和任何其他(s)LinkedTokenSource基于 Timeout 属性集创建一个:HttpClientIHttpClientFactoryCancellationToken

登记

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient("someClient",(client)=>
    {
        client.Timeout=Timespan.FromSeconds(15);
    });
}

用法

public class SomeService
{
    private IHttpClientFactory factory;
    public SomeService(IHttpClientFactory factory)
    {
        this.factory = factory;
    }
    public async Task MethodWithAggreatedToken(CancellationToken token = default)
    {
        CancellationToken additionalToken = token;
        if (additionalToken == default)
        {
            CancellationTokenSource source = new CancellationTokenSource();
            source.CancelAfter(Timespan.FromSeconds(10));
        }
        var client = factory.CreateClient("someService");
        HttpRequestMessage msg = new HttpRequestMessage(.....);
        using (var cts = CancellationTokenSource.CreateLinkedTokenSource(additionalToken,[DI token])
        {
            var response = await client.SendAsync(msg, cts.Token);
            //can i created a linked token?
            //and if not who gets priority : 
            //1.the token set via the  `Timeout` property set in Startup
            //2.the one injected in the `SendAsync`
        }
    }
}

在上述情况下,我希望能够Timeout为我设置一个泛型,typed HttpClient这将在许多方法中使用。现在我想知道是否:

我想知道我是否可以组合令牌以及谁会被覆盖(SendAsyncTimeout

标签: asp.net-corehttpclientcancellationtokensourcecancellation-token

解决方案


有一种方法可以在此一般条件之上添加额外的令牌,从而创建新的 LinkedTokenSource(s)

是的,您可以链接任意数量的链接CancellationTokenSource。因为CreateLinkedTokenSource返回 aCancellationTokenSource这就是您可以使用链接的原因。

CancellationTokenSource您还可以使用接受params的重载同时链接多个s 。

如果我在 HttpClient.SendAsync 中设置 CancellationToken,同时在 services.AddHttpClient 中声明 Timeout 属性,谁将获得优先权。

HttpClient 的备注清楚Timeout地说明了以下内容:

相同的超时将适用于使用此 HttpClient 实例的所有请求。您还可以使用任务上的 CancellationTokenSource 为各个请求设置不同的超时。请注意,只有两个超时中较短的一个才会适用。


编辑:反映您如何tokenHttpClient?

简而言之,它没有暴露。

如果您查看 HttpClient 的源代码(.NET Framework 实现.NET Core 实现),那么您会发现一个CancellationTokenSource名为pendingRequestsCts

SendAsync / SendAsyncCore方法中,pendingRequestsCts链接到给定操作的CancellationToken.

在 .NET Framework 的情况下,它是通过一个简单的CreateLinkedTokenSource调用来完成的。
另一方面,如果是 .NET Core,则要复杂一些。该PrepareCancellationTokenSource 方法包含链接的 CTS 和超时计算。


推荐阅读