From e5e60ddb9fb95a8132b785e596cc62f84fb8dbc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=9B=BD=E4=BC=9F?= <366193849@qq.com> Date: Mon, 30 Aug 2021 09:16:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E9=AB=98=E5=9F=9F=E5=90=8D=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E6=88=90=E5=8A=9F=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FastGithub.DomainResolve/DomainResolver.cs | 61 ++++++++++------------ 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/FastGithub.DomainResolve/DomainResolver.cs b/FastGithub.DomainResolve/DomainResolver.cs index 0357b47..0be2b36 100644 --- a/FastGithub.DomainResolve/DomainResolver.cs +++ b/FastGithub.DomainResolve/DomainResolver.cs @@ -27,10 +27,9 @@ namespace FastGithub.DomainResolve private readonly DnscryptProxy dnscryptProxy; private readonly ILogger logger; - private readonly TimeSpan lookupTimeout = TimeSpan.FromSeconds(5d); private readonly TimeSpan connectTimeout = TimeSpan.FromSeconds(5d); - private readonly TimeSpan dnscryptExpiration = TimeSpan.FromMinutes(5d); - private readonly TimeSpan fallbackExpiration = TimeSpan.FromMinutes(1d); + private readonly TimeSpan dnscryptExpiration = TimeSpan.FromMinutes(10d); + private readonly TimeSpan fallbackExpiration = TimeSpan.FromMinutes(2d); private readonly TimeSpan loopbackExpiration = TimeSpan.FromSeconds(5d); private readonly ConcurrentDictionary semaphoreSlims = new(); @@ -81,7 +80,16 @@ namespace FastGithub.DomainResolve try { await semaphore.WaitAsync(); - return await this.ResolveNoCacheAsync(domain, cancellationToken); + + for (var i = 0; i < 2; i++) + { + var address = await this.ResolveCoreAsync(domain, cancellationToken); + if (address != null) + { + return address; + } + } + throw new FastGithubException($"当前解析不到{domain.Host}可用的ip,请刷新重试"); } finally { @@ -91,12 +99,11 @@ namespace FastGithub.DomainResolve /// /// 解析域名 - /// 不使用缓存 /// /// /// /// - private async Task ResolveNoCacheAsync(DnsEndPoint domain, CancellationToken cancellationToken) + private async Task ResolveCoreAsync(DnsEndPoint domain, CancellationToken cancellationToken) { if (this.domainResolveCache.TryGetValue(domain, out var address)) { @@ -112,12 +119,12 @@ namespace FastGithub.DomainResolve if (address == null) { expiration = this.fallbackExpiration; - address = await this.FallbackLookupAsync(domain, cancellationToken); + address = await this.LookupByFallbackAsync(domain, cancellationToken); } if (address == null) { - throw new FastGithubException($"当前解析不到{domain.Host}可用的ip,请刷新重试"); + return default; } // 往往是被污染的dns @@ -137,7 +144,7 @@ namespace FastGithub.DomainResolve /// /// /// - private async Task FallbackLookupAsync(DnsEndPoint domain, CancellationToken cancellationToken) + private async Task LookupByFallbackAsync(DnsEndPoint domain, CancellationToken cancellationToken) { foreach (var dns in this.fastGithubConfig.FallbackDns) { @@ -151,7 +158,7 @@ namespace FastGithub.DomainResolve } /// - /// 查找ip + /// 查找最快的可用ip /// /// /// @@ -159,34 +166,20 @@ namespace FastGithub.DomainResolve /// private async Task LookupAsync(IPEndPoint dns, DnsEndPoint domain, CancellationToken cancellationToken) { - const int MAX_TRY_COUNT = 2; - for (var i = 0; i < MAX_TRY_COUNT; i++) + try { - try - { - var dnsClient = new DnsClient(dns); - using var timeoutTokenSource = new CancellationTokenSource(this.lookupTimeout); - using var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutTokenSource.Token); - var addresses = await dnsClient.Lookup(domain.Host, RecordType.A, linkedTokenSource.Token); - addresses = addresses.Where(address => this.disableIPAddressCache.TryGetValue(address, out _) == false).ToList(); - return await this.FindFastValueAsync(addresses, domain.Port, cancellationToken); - } - catch (OperationCanceledException) - { - continue; - } - catch (Exception ex) - { - this.logger.LogWarning($"dns({dns})无法解析{domain.Host}:{ex.Message}"); - return default; - } + var dnsClient = new DnsClient(dns); + var addresses = await dnsClient.Lookup(domain.Host, RecordType.A, cancellationToken); + addresses = addresses.Where(address => this.disableIPAddressCache.TryGetValue(address, out _) == false).ToList(); + return await this.FindFastValueAsync(addresses, domain.Port, cancellationToken); + } + catch (Exception ex) + { + this.logger.LogWarning($"dns({dns})无法解析{domain.Host}:{ex.Message}"); + return default; } - - this.logger.LogWarning($"dns({dns})无法解析{domain.Host}"); - return default; } - /// /// 获取最快的ip ///