如何使用.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 HttpClient
s。据我了解,这意味着我不能使用 IHttpClientFactory
.
然后剩下的就是客户端的手动实例化。但这也有问题:
- 如果定义为单例 - 网络级别的更改可能会使它们过时且无法使用。
- 如果不是单例 - 那么在重负载下应用程序将耗尽它的连接池
好吧,也许我可以定义有限数量的单例客户端并根据输入设置重用它们,并以某种方式监视网络并实施一种机制来重新创建过时的实例。我不知道该怎么做,但可以说它已经完成了 - 并非所有配置都发生在 HttpClient
级别。例如,代理和网络凭据发生在 HttpClientHandler
级别。据我了解 HttpClientHandler
应该是单身人士。如果是,我如何配置具有不同代理和凭据设置的并发 HttpClient
调用?
免责声明
我不知道这是否是最好的方法,但它是一个解决方案。当然,我不确定它是否解决了网络问题,如果使用单例客户端可能会出现这种问题。如果这些问题源自 HttpClientHandler
,那么它们可能会持续存在。在我们的案例中,我们将进行监控并在必要时采取进一步行动。
解决方案
原来占用连接的不是HttpClient
本身,而是HttpClientHandler
。这允许我们为每个请求创建新的客户端并重用并发 HttpClientHandler
实例。
唯一剩下的就是支持使用代理设置的并发调用。由于这些设置是在 HttpClientHandler
本身上配置的,我们可以通过创建我们自己的托管处理程序池来解决这个问题。当请求带有代理设置时,将检查 HttpClientHandler
的所有现有实例是否正在使用中。如果没有可用实例,将创建一个新实例并将其添加到池中。
我必须实现一个 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 HttpClient
s。据我了解,这意味着我不能使用 IHttpClientFactory
.
然后剩下的就是客户端的手动实例化。但这也有问题:
- 如果定义为单例 - 网络级别的更改可能会使它们过时且无法使用。
- 如果不是单例 - 那么在重负载下应用程序将耗尽它的连接池
好吧,也许我可以定义有限数量的单例客户端并根据输入设置重用它们,并以某种方式监视网络并实施一种机制来重新创建过时的实例。我不知道该怎么做,但可以说它已经完成了 - 并非所有配置都发生在 HttpClient
级别。例如,代理和网络凭据发生在 HttpClientHandler
级别。据我了解 HttpClientHandler
应该是单身人士。如果是,我如何配置具有不同代理和凭据设置的并发 HttpClient
调用?
免责声明
我不知道这是否是最好的方法,但它是一个解决方案。当然,我不确定它是否解决了网络问题,如果使用单例客户端可能会出现这种问题。如果这些问题源自 HttpClientHandler
,那么它们可能会持续存在。在我们的案例中,我们将进行监控并在必要时采取进一步行动。
解决方案
原来占用连接的不是HttpClient
本身,而是HttpClientHandler
。这允许我们为每个请求创建新的客户端并重用并发 HttpClientHandler
实例。
唯一剩下的就是支持使用代理设置的并发调用。由于这些设置是在 HttpClientHandler
本身上配置的,我们可以通过创建我们自己的托管处理程序池来解决这个问题。当请求带有代理设置时,将检查 HttpClientHandler
的所有现有实例是否正在使用中。如果没有可用实例,将创建一个新实例并将其添加到池中。