【问题标题】:Is it possible to set custom DNS resolver in C#'s HttpClient是否可以在 C# 的 HttpClient 中设置自定义 DNS 解析器
【发布时间】:2019-10-24 18:44:28
【问题描述】:

我到底想要什么:

public static CustomDnsResolver : Dns 
{
   .....
}

public static void Main(string[] args) 
{
    var httpClient = new HttpClient();
    httpClient.Dns(new CustomDnsResolver());
}

基本上我只是想在 HttpClient 中使用我的自定义 DNS 解析器而不是系统默认值,有什么方法可以实现吗?

【问题讨论】:

    标签: c# .net dns dotnet-httpclient


    【解决方案1】:

    您拥有的用例正是 Microsoft 构建 HttpClient 堆栈的原因。它允许您在 HttpMessageHandler 类的帮助下将业务逻辑放入分层类中。您可以在ms docsvisualstudiomagazine 中找到一些示例

    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";
        }
    }
    

    【讨论】:

    • 如果您尝试从 https 站点获取数据,此解决方案将不起作用。
    • 您可以覆盖证书验证以解决此问题。
    • 可以覆盖HttpClientHandler的ServerCertificateCustomValidationCallback来自定义证书验证
    • 这不能回答问题。您不能只说“覆盖证书验证”,我们期望我们正确设置主机名,以便 SSL 工作但避免 DNS 查找。
    • 这个答案对于一组约束是正确的。我不建议你通用的答案。如果它可以按原样帮助某些人。我还是很开心。如果其他人可以提出更好的答案,我会感谢他。
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 2017-02-22
      • 2012-12-07
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      相关资源
      最近更新 更多