【问题标题】:Creating LinkedTokenSource using typed HttpClient使用类型化的 HttpClient 创建 LinkedTokenSource
【发布时间】:2020-07-22 05:11:50
【问题描述】:

您好,我想了解如何使用键入的HttpClient(使用IHttpClientFactory)扩展和任何其他CancellationToken(s)基于超时属性集创建LinkedTokenSource

注册

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`
        }
    }
}

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

  • 有一种方法可以在此一般条件之上添加额外的Token(s),从而创建一个LinkedTokenSource
  • 如果我在HttpClient.SendAsync 中设置CancellationToken 同时在 services.AddHttpClient

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

【问题讨论】:

    标签: asp.net-core httpclient cancellationtokensource cancellation-token


    【解决方案1】:

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

    是的,您可以根据需要链接任意数量的CancellationTokenSource。因为CreateLinkedTokenSource 返回一个CancellationTokenSource,所以你可以使用链接。

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

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

    HttpClient 的TimeoutRemarks 明确说明如下:

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


    编辑:反映到你如何从HttpClient 中提取token

    总之就是不暴露。

    如果您查看 HttpClient 的源代码(.NET Framework implementation.NET Core implementation),您会发现一个名为 CancellationTokenSource 的私有字段 pendingRequestsCts

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

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

    【讨论】:

    • 好吧,关于优先级的问题已经回答了,以较短的跨度为准。但是关于LinkedTokenSource的问题,我了解它的功能,我对你如何extracta@感兴趣987654343@ 来自HttpClient
    • @BercoviciAdrian 我已经更新了我的答案以反映如何提取问题。
    • 这是我感兴趣的,所以没有暴露出来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多