构建后的 Flurl Proxy?

Flurl Proxy after construction?

我正在使用 Flurl 在我的应用程序中使用 API,我对代理有疑问。问题是我希望用户能够在启动后根据需要设置代理,Flurl 可以吗?

我找到了 , but that's recommending that you only call on startup so as far as I can tell you can't really change it after the fact. I also found 但那是将不同的请求分开使用不同的代理,这也不是我需要的。

基本上我希望它一开始就默认为无代理,就像它一样,并将其用于所有请求。稍后,如果用户设置代理并输入数据,我希望能够为 Flurl 设置代理,并让它在之后的所有请求中使用它。

有办法吗?

简短的回答是每次设置或更改代理时您都需要创建一个新客户端。这是由于依赖链下的约束:

  1. 代理信息设置在HttpClientHandler
  2. 处理程序被传递给 HttpClient 构造函数,此后无法更改。
  3. FlurlClient 恰好包装了一个 HttpClient,它要么通过其构造函数显式传递,要么(更典型地)通过其默认规则或自定义规则 configured via settings and factories 延迟创建。一旦创建就无法更改。
  4. 即使您持有对 HttpClientHandler 的引用并在稍后尝试更改其代理设置,您也会得到 .

如果您目前没有明确使用 FlurlClient,我会切换到该范例。以下是用户更改代理时需要发生的情况的示例:

var hch = new HttpClientHandler {
    UseProxy = true,
    Proxy = new WebProxy(proxyUrl)
};
var hc = new HttpClient(hch) { BaseAddress = baseUrl };
var fc = new FlurlClient(hc);

然后你可以流畅地建立调用 fc 类似于你从 URL:

开始的方式
var thing = await fc.Request("path", "to", "endpoint").GetJsonAsync<T>();

根据您是否有多个并发用户或并发调用,您可以通过将其封装到每个代理地址缓存 FlurlClient 个实例的东西中来使其更加健壮,例如使用 ConcurrentDictionay.