如何使用.Net 5实现Http代理

How to implement Http proxy using .Net 5

我必须实现一个 HTTP“代理”服务,它将使用 HttpSettings 接口从其他服务内部调用。

设置应该类似于:

interface ISettings {
    string Host { get; set; }
    string Port { get; set; }
    string Username { get; set; }
    string Password { get; set; }
    bool UseSsl { get; set; }
    string ProxyUrl { get; set; }
    string ProxyPort { get; set; }
    string Timeout { get; set; }
    HttpHeaders Headers { get; set; }
}

由于服务的通用性,我无法按照 MS 的描述预定义 named or typed HttpClients。据我了解,这意味着我不能使用 IHttpClientFactory.

然后剩下的就是客户端的手动实例化。但这也有问题:

好吧,也许我可以定义有限数量的单例客户端并根据输入设置重用它们,并以某种方式监视网络并实施一种机制来重新创建过时的实例。我不知道该怎么做,但可以说它已经完成了 - 并非所有配置都发生在 HttpClient 级别。例如,代理和网络凭据发生在 HttpClientHandler 级别。据我了解 HttpClientHandler 应该是单身人士。如果是,我如何配置具有不同代理和凭据设置的并发 HttpClient 调用?

免责声明

我不知道这是否是最好的方法,但它是一个解决方案。当然,我不确定它是否解决了网络问题,如果使用单例客户端可能会出现这种问题。如果这些问题源自 HttpClientHandler,那么它们可能会持续存在。在我们的案例中,我们将进行监控并在必要时采取进一步行动。

解决方案

原来占用连接的不是HttpClient本身,而是HttpClientHandler。这允许我们为每个请求创建新的客户端并重用并发 HttpClientHandler 实例。

唯一剩下的就是支持使用代理设置的并发调用。由于这些设置是在 HttpClientHandler 本身上配置的,我们可以通过创建我们自己的托管处理程序池来解决这个问题。当请求带有代理设置时,将检查 HttpClientHandler 的所有现有实例是否正在使用中。如果没有可用实例,将创建一个新实例并将其添加到池中。