You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从IFlurlClientFactory升级到IFlurlClientCache:是否需用using包裹GetOrAdd()?

问题解答

核心结论

绝对不能用using包裹从IFlurlClientCache获取的FlurlClient——这就是你并发请求失败的根本原因。

原因分析

IFlurlClientCache的核心设计目标是复用客户端实例,GetOrAdd方法返回的是缓存池里的共享实例,不是临时创建的一次性对象。你用using包裹它,会在代码块结束时强制调用Dispose释放客户端,导致后续并发请求从缓存拿到的是已被释放的失效实例,自然无法正常发送请求。

关于客户端释放的疑问

完全不需要手动处理未使用客户端的释放:

  • IFlurlClientCache会自动管理客户端的生命周期,后台会定期清理长时间未被使用的客户端实例,并释放其占用的资源。
  • 连续快速调用场景下,活跃的客户端会被缓存保留,确保复用效率,不会出现“在再次使用前被释放”的问题。

修正后的代码示例

public class FlurlHttpClient
{
    private IFlurlClientCache ClientCache { get; set; }

    public FlurlHttpClient(IFlurlClientCache clientCache)
        => ClientCache = clientCache;
    
    public async Task<string> DoCall() // 补充async修饰符,匹配内部await调用
    {
        ...
        
        var client = ClientCache.GetOrAdd("ExampleHostName", "http://example.host.com/api");
        
        ...
        
        var httpResponse = await client.SendAsync
        (
            new FlurlRequest
            {
                Content = content,
                Url = url,
                Verb = request.HttpMethod,
            }
        );
        
        ...
    }
}

内容的提问来源于stack exchange,提问作者Colin Campbell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:32:43