代码之家  ›  专栏  ›  技术社区  ›  sfaust

施工后的Flurl代理?

  •  0
  • sfaust  · 技术社区  · 5 年前

    我正在使用flurl在我的应用程序中使用API,我有一个关于代理的问题。问题是,我希望用户能够在启动后根据需要设置代理,这对于Flurl来说是可能的吗?

    我找到了 this 但这建议你只能在我能告诉你的范围内打电话给创业公司,事实上你不能真正改变它。我也发现了 this 但这将分离出使用不同代理的不同请求,这也不是我需要的。

    基本上,我希望它一开始默认为不使用代理,并将其用于所有请求。稍后,如果用户设置了代理并输入了数据,我希望能够为flurl设置代理,并让它为此后的所有请求使用该代理。

    有办法吗?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Todd Menier    5 年前

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

    1. HttpClientHandler .
    2. 处理程序传递给 HttpClient 构造函数,之后不能更改。
    3. FlurlClient 正好一个 http客户端 ,或者通过其构造函数显式传递,或者(更典型地说)通过其默认规则或自定义规则惰性地创建。 configured via settings and factories 。一旦创建,就无法更改。
    4. 即使你提到 httpClientHandler 稍后尝试更改其代理设置,您将获得 runtime error .

    如果您当前没有使用 氟客户端 明确地说,我会转向那个模式。下面是一个示例,说明当用户更改代理时需要执行的操作:

    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>();
    

    根据您是有多个并发用户还是有多个并发调用,您可以通过将其封装到缓存中使其更加健壮。 氟客户端 每个代理地址的实例,例如使用 ConcurrentDictionay .