【问题标题】:How to set up a proxy server for a flurl client selectively?如何有选择地为 flurl 客户端设置代理服务器?
【发布时间】:2022-10-21 23:13:48
【问题描述】:

是否有推荐的方法根据 URL(或基本 URL)为 flurl 客户端定义代理?我在我确实找到的主题的文档和讨论中找不到任何内容(例如Setting a per-request proxy (or rotating proxies) with .NET Flurl/HttpClient)侧重于更复杂的案例,How can I use proxies for web requests in Flurl? 似乎设置了会影响所有呼叫的设置(除非我误解了它) .

在我们的场景中,一个应用程序调用不同的端点(其他应用程序)。其中一些端点只能通过代理服务器访问,有些可以直接访问。此外,在某些环境中(DEV vs. PREPROD vs PROD),相同的端点可能需要或不需要代理,因此配置可能类似于:

开发者

预加工

产品

在这种情况下,我假设我们需要三个 HTTP 客户端(X、Y 和 Z)。为这些客户端配置代理设置的正确方法是什么?

【问题讨论】:

    标签: c# asp.net-core flurl


    【解决方案1】:

    我建议创建一个新的HttpClient 工厂,它接受here 描述的代理地址,但不要在全局范围内注册它,而是创建一个FlurlClientFactory,如here 描述的那样覆盖FlurlClientFactoryBase 并使用代理地址缓存键,保证每个代理恰好有 1 个FlurlClient

    public class ProxyFlurlClientFactory : FlurlClientFactoryBase
    {
        protected override string GetCacheKey(Url url) => GetProxyForUrl(Url url);
    
        // Guaranteed to be called only once per proxy
        protected override IFlurlClient Create(Url url) {
            var httpFac = new ProxyHttpClientFactory(GetProxyForUrl(Url url));
            return new FlurlClient().Configure(settings => settings.HttpClientFactory = httpFac));
        }
        
        private string GetProxyForUrl(Url url) => ???; // whatever your rules are to pick the right one
    }
    

    这可以全局注册:

    FlurlHttp.Configure(settings => settings.FlurlClientFactory = new ProxyFlurlClientFactory());
    

    如果您愿意,也可以通过DI pattern 注入它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2012-05-26
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多