我有Asp.Net Core WebApi
。我根据HttpClientFactory pattern提出Http请求。这是我的示例代码:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddHttpClient<IMyInterface, MyService>();
...
}
public class MyService: IMyInterface
{
private readonly HttpClient _client;
public MyService(HttpClient client)
{
_client = client;
}
public async Task CallHttpEndpoint()
{
var request = new HttpRequestMessage(HttpMethod.Get, "www.customUrl.com");
var response = await _client.SendAsync(request);
...
}
}
我想通过动态代理实现发送请求。这基本上意味着我可能需要为每个请求更改代理。至于现在我发现了两个approuces,其中没有一个看起来对我很好:
1.有这样的静态代理:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddHttpClient<IMyInterface, MyService>().ConfigurePrimaryHttpMessageHandler(() =>
{
return new HttpClientHandler
{
Proxy = new WebProxy("http://127.0.0.1:8888"),
UseProxy = true
};
});
...
}
但是在这种方法中我只能为每个服务提供单个代理。
2.根据每个要求设置HttpClient
:
HttpClientHandler handler = new HttpClientHandler()
{
Proxy = new WebProxy("http://127.0.0.1:8888"),
UseProxy = true,
};
using(var client = new HttpClient(handler))
{
var request = new HttpRequestMessage(HttpMethod.Get, "www.customUrl.com");
var response = await client.SendAsync(request);
...
}
但是这样我违反了HttpClientFactory模式,它可能会导致应用程序性能出现问题,如下面的article所述
有没有第三种方法可以动态更改代理而无需重新创建qazxsw poi?
在实例化之后,无法更改HttpClient
的任何属性或将新版本的HttpClientHandler
指定给现有的HttpClientHandler
。因此,不可能为特定的HttpClient
提供动态代理:您只能指定一个代理。
实现此目的的正确方法是使用命名客户端,并为每个代理端点定义客户端。然后,您需要注入HttpClient
并选择要使用的代理之一,请求实现该代理的命名客户端。
IHttpClientFactory
然后:
services.AddHttpClient("MyServiceProxy1").ConfigurePrimaryHttpMessageHandler(() =>
{
return new HttpClientHandler
{
Proxy = new WebProxy("http://127.0.0.1:8888"),
UseProxy = true
};
});
services.AddHttpClient("MyServiceProxy2").ConfigurePrimaryHttpMessageHandler(() =>
{
return new HttpClientHandler
{
Proxy = new WebProxy("http://127.0.0.1:8889"),
UseProxy = true
};
});
...