asp.net-core - 使用类型化的 HttpClient 创建 LinkedTokenSource
问题描述
您好,我想了解如何使用类型化(使用)扩展名和任何其他(s)LinkedTokenSource
基于 Timeout 属性集创建一个:HttpClient
IHttpClientFactory
CancellationToken
登记
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
这将在许多方法中使用。现在我想知道是否:
- 有一种方法可以
Token
在这个一般条件之上添加额外的(s),从而创建一个LinkedTokenSource
CancellationToken
如果我在其中设置 aHttpClient.SendAsync
同时Timeout
在services.AddHttpClient
.
我想知道我是否可以组合令牌以及谁会被覆盖(SendAsync
或Timeout
)
解决方案
有一种方法可以在此一般条件之上添加额外的令牌,从而创建新的 LinkedTokenSource(s)
是的,您可以链接任意数量的链接CancellationTokenSource
。因为CreateLinkedTokenSource
返回 aCancellationTokenSource
这就是您可以使用链接的原因。
CancellationTokenSource
您还可以使用接受params的重载同时链接多个s 。
如果我在 HttpClient.SendAsync 中设置 CancellationToken,同时在 services.AddHttpClient 中声明 Timeout 属性,谁将获得优先权。
HttpClient 的备注清楚Timeout
地说明了以下内容:
相同的超时将适用于使用此 HttpClient 实例的所有请求。您还可以使用任务上的 CancellationTokenSource 为各个请求设置不同的超时。请注意,只有两个超时中较短的一个才会适用。
编辑:反映您如何token
从HttpClient
?
简而言之,它没有暴露。
如果您查看 HttpClient 的源代码(.NET Framework 实现,.NET Core 实现),那么您会发现一个CancellationTokenSource
名为pendingRequestsCts
在SendAsync / SendAsyncCore方法中,pendingRequestsCts
链接到给定操作的CancellationToken
.
在 .NET Framework 的情况下,它是通过一个简单的CreateLinkedTokenSource
调用来完成的。
另一方面,如果是 .NET Core,则要复杂一些。该PrepareCancellationTokenSource
方法包含链接的 CTS 和超时计算。
推荐阅读
- ios - 如何让 XCode 查看用于签署证书的私钥?
- java - 用HTL调用时在java中使用“is”或“get”有什么区别
- sql - 试图用字母数字分割字符串
- c++ - 将属性保存到类的 C++ 程序问题
- javascript - Axios.get 返回状态码 400 无法找出问题所在(SODAapi)
- excel - 如何在 Excel 中使用折线图类型将水平轴从类别更改为值
- python - mi PATH“-bash:ls:找不到命令”的问题请帮助:)
- javascript - 有没有办法在 MongoDB 中针对不同类型的文档进行单个查询,并将每种类型限制为一个集合中的特定数字?
- node.js - React js TypeError:无法读取未定义的属性“参数”
- c++ - C++ 与库的兼容性