前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为重复使用的HttpClient对象动态修改Timeout

为重复使用的HttpClient对象动态修改Timeout

作者头像
旺财的城堡
发布2021-04-09 15:06:53
1.1K0
发布2021-04-09 15:06:53
举报
文章被收录于专栏:calvin

最近博客园被**了, 赶紧水一文支持一下博客园,加油!

问题现象

HttpClient被使用过之后, 在修改它们的属性会抛出错误This instance has already started one or more requests. Properties can only be modified before sending the first request.

场景

  • 单例 HttpClient 对象, 我们要修改它的 Timeout
  • Scope生命周期的 HttpClient, 我们要修改它的 Timeout

解决方法一

可以把 HttpClient 的生命周期改成 Transient, 并且每次要用的时候都从 IServiceProvider 获取.

解决方法二

在注册 的时候把它的 修改为

代码语言:javascript
复制
services.AddHttpClient<MyApiService>((sp, client) =>
{
    client.Timeout = System.Threading.Timeout.InfiniteTimeSpan;
    client.BaseAddress = sp.GetService<MyOptions>().ApiEndpoint;
    }
});

然后调用的地方使用自己的来实现即可, 其实在内部也是一样的方式.

参考HttpClient.SendAsync的部分源代码:

代码语言:javascript
复制
CancellationTokenSource cts;
bool disposeCts;
bool hasTimeout = _timeout != s_infiniteTimeout;
if (hasTimeout || cancellationToken.CanBeCanceled)
{
    disposeCts = true;
    cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _pendingRequestsCts.Token);
    if (hasTimeout)
    {
        cts.CancelAfter(_timeout);
    }
}
else
{
    disposeCts = false;
    cts = _pendingRequestsCts;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题现象
  • 场景
  • 解决方法一
  • 解决方法二
  • 参考HttpClient.SendAsync的部分源代码:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档