Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在C#和#x27;https客户端_C#_.net_Dns_Dotnet Httpclient - Fatal编程技术网

是否可以在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";
    }
}