备用DNS优化
This commit is contained in:
74
Form1.cs
74
Form1.cs
@@ -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;
|
||||
|
Reference in New Issue
Block a user