|
2 | 2 | using MultiSourceContentDelivery.DbContexts; |
3 | 3 | using MultiSourceContentDelivery.Models; |
4 | 4 | using System.Net.Http.Json; |
| 5 | +using System.Net.NetworkInformation; |
| 6 | +using System.Net; |
5 | 7 | using Polly; |
6 | 8 | using Polly.Retry; |
7 | 9 | using FileInfo = MultiSourceContentDelivery.Models.FileInfo; |
@@ -165,16 +167,17 @@ private async Task ScanDirectoryAndUpdateDatabase(CancellationToken stoppingToke |
165 | 167 | ContentType = GetContentType(file), |
166 | 168 | Size = new IOFileInfo(file).Length, |
167 | 169 | LocalPath = relPath, |
168 | | - AvailableNodes = new List<string> { $"http://{Environment.MachineName}" } |
| 170 | + AvailableNodes = new List<string> { GetNodeUrl() } |
169 | 171 | }; |
170 | 172 | await context.FileInfos.AddAsync(fileInfo); |
171 | 173 | } |
172 | 174 | else |
173 | 175 | { |
174 | 176 | fileInfo.LocalPath = relPath; |
175 | | - if (!fileInfo.AvailableNodes.Contains($"http://{Environment.MachineName}")) |
| 177 | + var nodeUrl = GetNodeUrl(); |
| 178 | + if (!fileInfo.AvailableNodes.Contains(nodeUrl)) |
176 | 179 | { |
177 | | - fileInfo.AvailableNodes.Add($"http://{Environment.MachineName}"); |
| 180 | + fileInfo.AvailableNodes.Add(nodeUrl); |
178 | 181 | } |
179 | 182 | } |
180 | 183 | } |
@@ -206,7 +209,7 @@ private async Task SyncWithOtherNodes(CancellationToken stoppingToken) |
206 | 209 | // 更新本节点信息 |
207 | 210 | var nodeInfo = new NodeInfo |
208 | 211 | { |
209 | | - Url = $"http://{Environment.MachineName}", |
| 212 | + Url = GetNodeUrl(), |
210 | 213 | AvailableStorageBytes = await GetAvailableStorageAsync(), |
211 | 214 | CurrentLoad = await GetCurrentLoadAsync(), |
212 | 215 | LastSeen = DateTime.UtcNow |
@@ -352,4 +355,27 @@ private string GetContentType(string filePath) |
352 | 355 | _ => "application/octet-stream" |
353 | 356 | }; |
354 | 357 | } |
| 358 | + |
| 359 | + private string GetNodeUrl() |
| 360 | + { |
| 361 | + try |
| 362 | + { |
| 363 | + // 获取本机所有网络接口的IP地址 |
| 364 | + var ipAddress = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces() |
| 365 | + .Where(n => n.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up) |
| 366 | + .SelectMany(n => n.GetIPProperties().UnicastAddresses) |
| 367 | + .Where(a => a.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork |
| 368 | + && !System.Net.IPAddress.IsLoopback(a.Address)) |
| 369 | + .Select(a => a.Address.ToString()) |
| 370 | + .FirstOrDefault(); |
| 371 | + |
| 372 | + // 如果找不到合适的IP地址,使用localhost |
| 373 | + return $"http://{ipAddress ?? "localhost"}"; |
| 374 | + } |
| 375 | + catch (Exception ex) |
| 376 | + { |
| 377 | + _logger.LogError(ex, "Error getting node URL, falling back to localhost"); |
| 378 | + return $"http://localhost"; |
| 379 | + } |
| 380 | + } |
355 | 381 | } |
0 commit comments