备用DNS优化

This commit is contained in:
qinsi_travel
2025-06-19 03:01:21 +08:00
parent abc8bc406c
commit 79b3a6ed7c

View File

@@ -38,6 +38,12 @@ namespace CheckDownload
private const string OssAccessKeyId = "LTAI5tCwRcL5LUgyHB2j7w82";
// 阿里云OSS访问密钥Secret
private const string OssAccessKeySecret = "7ClQns3wz6psmIp9T2OfuEn3tpzrCK";
// 网络优化: 静态HttpClient实例避免套接字耗尽
private static readonly HttpClient _httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(20) };
// 网络优化: 备用DNS服务列表提高解析成功率
private static readonly List<string> _dnsServers = new List<string> { "223.5.5.5", "119.29.29.29" };
// 用于存储下载的文件数据
private Dictionary<string, (byte[] Data, string ExpectedMd5)> _downloadedFiles = new Dictionary<string, (byte[], string)>();
// 已完成的下载数量
@@ -389,9 +395,7 @@ namespace CheckDownload
UpdateStatus($"第 {i + 1} 次重试,剩余 {filesToRetry.Count} 个文件...");
var failedThisRound = new ConcurrentDictionary<string, string>();
// 清空上一轮的失败记录,准备重试
filesToRetry.Clear();
// BUG修复: 此处不应清空重试队列
await PerformDownloads(filesToRetry, failedThisRound);
filesToRetry = new Dictionary<string, string>(failedThisRound);
@@ -408,28 +412,35 @@ namespace CheckDownload
private async Task<List<string>> GetIpAddressesForDomain(string domain)
{
try
foreach (var dnsServer in _dnsServers)
{
using (var httpClient = new HttpClient())
try
{
var request = new HttpRequestMessage(HttpMethod.Get, $"https://223.5.5.5/resolve?name={domain}&type=1&short=1");
request.Headers.Add("User-Agent", "Apifox/1.0.0 (https://apifox.com)");
request.Headers.Add("Accept", "*/*");
request.Headers.Host = "223.5.5.5";
request.Headers.Add("Connection", "keep-alive");
var requestUri = $"https://{dnsServer}/resolve?name={domain}&type=1&short=1";
var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
request.Headers.Add("User-Agent", "CheckDownload/1.0");
request.Headers.Host = dnsServer;
var response = await httpClient.SendAsync(request);
var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<List<string>>(responseBody);
var ips = JsonConvert.DeserializeObject<List<string>>(responseBody);
if (ips != null && ips.Any())
{
UpdateStatus($"通过 {dnsServer} 成功解析域名 {domain}");
return ips;
}
}
catch (Exception ex)
{
UpdateStatus($"通过 {dnsServer} 解析域名失败,尝试下一个...");
await Task.Delay(500); // 短暂延迟后重试
}
}
catch (Exception ex)
{
UpdateStatus($"获取域名IP失败: {domain} - {ex.Message}");
return new List<string>();
}
UpdateStatus($"所有DNS服务器均无法解析域名: {domain}");
return new List<string>();
}
private void VerifyAndSaveAllFiles()
@@ -757,25 +768,24 @@ namespace CheckDownload
{
// 替换URL中的host为IP
var ipUrl = signedUrl.Replace(signedUri.Host, ip);
using (var httpClient = new HttpClient())
// 网络优化: 使用静态HttpClient实例
var request = new HttpRequestMessage(HttpMethod.Get, ipUrl);
request.Headers.Host = signedUri.Host; // Host头保持原域名
var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
byte[] fileData = await response.Content.ReadAsByteArrayAsync();
string localDir = Path.GetDirectoryName(localPath);
if (!Directory.Exists(localDir))
{
var request = new HttpRequestMessage(HttpMethod.Get, ipUrl);
request.Headers.Host = signedUri.Host; // Host头保持原域名
var response = await httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
byte[] fileData = await response.Content.ReadAsByteArrayAsync();
string localDir = Path.GetDirectoryName(localPath);
if (!Directory.Exists(localDir))
{
Directory.CreateDirectory(localDir);
}
File.WriteAllBytes(localPath, fileData);
return true;
Directory.CreateDirectory(localDir);
}
File.WriteAllBytes(localPath, fileData);
return true;
}
catch (Exception ex)
catch (Exception)
{
UpdateStatus($"备用方案用IP下载失败");
UpdateStatus($"备用方案用IP {ip} 下载失败");
}
}
return false;