|
@ -34,11 +34,13 @@ public class NetworkStatusMonitor : INetworkStatusMonitor |
|
|
/// <param name="endPoints">网络端点信息</param>
|
|
|
/// <param name="endPoints">网络端点信息</param>
|
|
|
/// <param name="configType">网络配置类型</param>
|
|
|
/// <param name="configType">网络配置类型</param>
|
|
|
/// <param name="timeoutSeconds">超时时间(秒),默认30秒</param>
|
|
|
/// <param name="timeoutSeconds">超时时间(秒),默认30秒</param>
|
|
|
|
|
|
/// <param name="isStartOperation">是否为启动操作,true表示启动操作,false表示停止操作</param>
|
|
|
/// <returns>检查结果</returns>
|
|
|
/// <returns>检查结果</returns>
|
|
|
public async Task<NetworkStatusCheckResult> CheckAllEndPointsStatusAsync( |
|
|
public async Task<NetworkStatusCheckResult> CheckAllEndPointsStatusAsync( |
|
|
NetworkIPEndPointCollection endPoints, |
|
|
NetworkIPEndPointCollection endPoints, |
|
|
NetworkConfigType configType, |
|
|
NetworkConfigType configType, |
|
|
int? timeoutSeconds = null) |
|
|
int? timeoutSeconds = null, |
|
|
|
|
|
bool isStartOperation = true) |
|
|
{ |
|
|
{ |
|
|
var result = new NetworkStatusCheckResult(); |
|
|
var result = new NetworkStatusCheckResult(); |
|
|
var startTime = DateTime.Now; |
|
|
var startTime = DateTime.Now; |
|
@ -46,43 +48,72 @@ public class NetworkStatusMonitor : INetworkStatusMonitor |
|
|
|
|
|
|
|
|
try |
|
|
try |
|
|
{ |
|
|
{ |
|
|
_logger.LogInformation("开始检查网络端点状态,配置类型: {ConfigType}, 超时时间: {TimeoutSeconds}秒", |
|
|
_logger.LogInformation("开始检查网络端点状态,配置类型: {ConfigType}, 操作类型: {OperationType}, 超时时间: {TimeoutSeconds}秒", |
|
|
configType, timeout.TotalSeconds); |
|
|
configType, isStartOperation ? "Start" : "Stop", timeout.TotalSeconds); |
|
|
|
|
|
|
|
|
// 先执行一次检查
|
|
|
// 先执行一次检查
|
|
|
var checkResults = await CheckEndPointsByConfigTypeAsync(endPoints, configType); |
|
|
var checkResults = await CheckEndPointsByConfigTypeAsync(endPoints, configType); |
|
|
result.IsSuccess = checkResults.All(r => r.IsSuccess); |
|
|
|
|
|
|
|
|
|
|
|
// 如果检查失败,进入重试循环
|
|
|
// 根据操作类型采用不同的检查策略
|
|
|
while (!result.IsSuccess && DateTime.Now - startTime < timeout) |
|
|
if (isStartOperation) |
|
|
{ |
|
|
{ |
|
|
var failedEndpoints = checkResults.Where(r => !r.IsSuccess) |
|
|
// Start 操作:所有端点必须成功
|
|
|
.Select(r => $"{r.ComAddr}: {r.ErrorMessage}"); |
|
|
|
|
|
var errorMessage = string.Join("; ", failedEndpoints); |
|
|
|
|
|
_logger.LogWarning("网络端点状态检查未通过,失败端点: {FailedEndpoints},将在1秒后重试,已耗时: {ElapsedTime}秒", |
|
|
|
|
|
errorMessage, (DateTime.Now - startTime).TotalSeconds); |
|
|
|
|
|
|
|
|
|
|
|
await Task.Delay(1000); // 等待1秒后重试
|
|
|
|
|
|
|
|
|
|
|
|
// 重试检查
|
|
|
|
|
|
checkResults = await CheckEndPointsByConfigTypeAsync(endPoints, configType); |
|
|
|
|
|
result.IsSuccess = checkResults.All(r => r.IsSuccess); |
|
|
result.IsSuccess = checkResults.All(r => r.IsSuccess); |
|
|
|
|
|
|
|
|
|
|
|
// 如果检查失败,进入重试循环
|
|
|
|
|
|
while (!result.IsSuccess && DateTime.Now - startTime < timeout) |
|
|
|
|
|
{ |
|
|
|
|
|
var failedEndpoints = checkResults.Where(r => !r.IsSuccess) |
|
|
|
|
|
.Select(r => $"{r.ComAddr}: {r.ErrorMessage}"); |
|
|
|
|
|
var errorMessage = string.Join("; ", failedEndpoints); |
|
|
|
|
|
_logger.LogWarning("网络端点状态检查未通过,失败端点: {FailedEndpoints},将在1秒后重试,已耗时: {ElapsedTime}秒", |
|
|
|
|
|
errorMessage, (DateTime.Now - startTime).TotalSeconds); |
|
|
|
|
|
|
|
|
|
|
|
await Task.Delay(1000); // 等待1秒后重试
|
|
|
|
|
|
|
|
|
|
|
|
// 重试检查
|
|
|
|
|
|
checkResults = await CheckEndPointsByConfigTypeAsync(endPoints, configType); |
|
|
|
|
|
result.IsSuccess = checkResults.All(r => r.IsSuccess); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
// Stop 操作:所有端点必须失败
|
|
|
|
|
|
result.IsSuccess = checkResults.All(r => !r.IsSuccess); |
|
|
|
|
|
|
|
|
|
|
|
// 如果检查未失败,进入重试循环
|
|
|
|
|
|
while (!result.IsSuccess && DateTime.Now - startTime < timeout) |
|
|
|
|
|
{ |
|
|
|
|
|
var activeEndpoints = checkResults.Where(r => r.IsSuccess) |
|
|
|
|
|
.Select(r => r.ComAddr); |
|
|
|
|
|
var errorMessage = string.Join("; ", activeEndpoints); |
|
|
|
|
|
_logger.LogWarning("网络端点仍然处于活动状态: {ActiveEndpoints},将在1秒后重试,已耗时: {ElapsedTime}秒", |
|
|
|
|
|
errorMessage, (DateTime.Now - startTime).TotalSeconds); |
|
|
|
|
|
|
|
|
|
|
|
await Task.Delay(1000); // 等待1秒后重试
|
|
|
|
|
|
|
|
|
|
|
|
// 重试检查
|
|
|
|
|
|
checkResults = await CheckEndPointsByConfigTypeAsync(endPoints, configType); |
|
|
|
|
|
result.IsSuccess = checkResults.All(r => !r.IsSuccess); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (!result.IsSuccess) |
|
|
if (!result.IsSuccess) |
|
|
{ |
|
|
{ |
|
|
result.ErrorMessage = new string[] { $"检查超时,已超过{timeout.TotalSeconds}秒" }; |
|
|
result.ErrorMessage = new string[] { $"检查超时,已超过{timeout.TotalSeconds}秒" }; |
|
|
_logger.LogWarning("网络端点状态检查超时,配置类型: {ConfigType}", configType); |
|
|
_logger.LogWarning("网络端点状态检查超时,配置类型: {ConfigType}, 操作类型: {OperationType}", |
|
|
|
|
|
configType, isStartOperation ? "Start" : "Stop"); |
|
|
} |
|
|
} |
|
|
else |
|
|
else |
|
|
{ |
|
|
{ |
|
|
_logger.LogInformation("网络端点状态检查成功,配置类型: {ConfigType}, 耗时: {ElapsedTime}秒", |
|
|
_logger.LogInformation("网络端点状态检查成功,配置类型: {ConfigType}, 操作类型: {OperationType}, 耗时: {ElapsedTime}秒", |
|
|
configType, (DateTime.Now - startTime).TotalSeconds); |
|
|
configType, isStartOperation ? "Start" : "Stop", (DateTime.Now - startTime).TotalSeconds); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
catch (Exception ex) |
|
|
catch (Exception ex) |
|
|
{ |
|
|
{ |
|
|
_logger.LogError(ex, "检查网络端点状态时发生错误,配置类型: {ConfigType}", configType); |
|
|
_logger.LogError(ex, "检查网络端点状态时发生错误,配置类型: {ConfigType}, 操作类型: {OperationType}", |
|
|
|
|
|
configType, isStartOperation ? "Start" : "Stop"); |
|
|
result.IsSuccess = false; |
|
|
result.IsSuccess = false; |
|
|
result.ErrorMessage = new string[] { $"检查过程发生异常: {ex.Message}" }; |
|
|
result.ErrorMessage = new string[] { $"检查过程发生异常: {ex.Message}" }; |
|
|
} |
|
|
} |
|
|