我最近从旧的 IFlurlClientFactory 更新到新的 IFlurlClientCache,从而应用了所有必需的更改。
我们在使用以下代码时遇到问题:
public class FlurlHttpClient
{
private IFlurlClientCache ClientCache { get; set; }
public FlurlHttpClient(IFlurlClientCache clientCache)
=> ClientCache = clientCache;
public string DoCall()
{
...
using (var client = ClientCache.GetOrAdd("ExampleHostName", "http://example.host.com/api"))
{
...
var httpResponse = await client.SendAsync
(
new FlurlRequest
{
Content = content,
Url = url,
Verb = request.HttpMethod,
}
);
...
}
...
}
}
该代码适用于 1-1 调用情况 - 即当单个调用进入我们的 API 然后使用此类时,但是当多个调用进入我们的 API 并因此同时使用此方法时,httpResponse 将不会成功..
我们发现解决此问题的唯一方法是删除 using 部分,但我不确定这是否是正确的路径,因为看起来我们可能会在客户端再次使用之前将其处置 -尤其是快速连续..
又名——我需要找到另一种方法来处理未使用的客户端还是现在在后台处理?
不,绝对不要将
ClientCache.GetOrAdd
包含在 using
语句中。这有效地在 using
块的末尾处理客户端,使其无法用于将来的调用,这违背了缓存它的目的。
FlurlClient
也不需要。