是否可以在C#和#x27;https客户端
我到底想要什么:是否可以在C#和#x27;https客户端,c#,.net,dns,dotnet-httpclient,C#,.net,Dns,Dotnet Httpclient,我到底想要什么: public static CustomDnsResolver : Dns { ..... } public static void Main(string[] args) { var httpClient = new HttpClient(); httpClient.Dns(new CustomDnsResolver()); } 基本上,我只想在HttpClient中使用我的自定义DNS解析器,而不是系统默认值,有什么方法可以实现吗?您的用例正是
public static CustomDnsResolver : Dns
{
.....
}
public static void Main(string[] args)
{
var httpClient = new HttpClient();
httpClient.Dns(new CustomDnsResolver());
}
基本上,我只想在HttpClient中使用我的自定义DNS解析器,而不是系统默认值,有什么方法可以实现吗?您的用例正是Microsoft构建HttpClient堆栈的原因。它允许您在
HttpMessageHandler
类的帮助下将业务逻辑放入分层类中。您可以在或中找到一些样品
void Main()
{
var dnsHandler=new dnsHandler(new CustomDnsResolver());
var客户端=新的HttpClient(dnsHandler);
var html=client.GetStringAsync(“http://google.com三、结果;
}
公共类DnsHandler:HttpClientHandler
{
私有只读CustomDnsResolver\u dnsResolver;
公共DnsHandler(自定义dnsResolver dnsResolver)
{
_dnsResolver=dnsResolver;
}
受保护的覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
var host=request.RequestUri.host;
var ip=_dnsResolver.Resolve(主机);
var builder=新的UriBuilder(request.RequestUri);
builder.Host=ip;
request.RequestUri=builder.Uri;
返回base.sendaync(请求、取消令牌);
}
}
公共类CustomDnsResolver
{
公共字符串解析(字符串主机)
{
返回“127.0.0.1”;
}
}
考虑使用。如果尝试从https站点获取数据,则此解决方案无效。您可以覆盖证书验证以解决此问题。您可以覆盖HttpClientHandler的ServerCertificateStoMValidationCallback以自定义证书验证
void Main()
{
var dnsHandler = new DnsHandler(new CustomDnsResolver());
var client = new HttpClient(dnsHandler);
var html = client.GetStringAsync("http://google.com").Result;
}
public class DnsHandler : HttpClientHandler
{
private readonly CustomDnsResolver _dnsResolver;
public DnsHandler(CustomDnsResolver dnsResolver)
{
_dnsResolver = dnsResolver;
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var host = request.RequestUri.Host;
var ip = _dnsResolver.Resolve(host);
var builder = new UriBuilder(request.RequestUri);
builder.Host = ip;
request.RequestUri = builder.Uri;
return base.SendAsync(request, cancellationToken);
}
}
public class CustomDnsResolver
{
public string Resolve(string host)
{
return "127.0.0.1";
}
}