.net c# 方法请求时报错: One or more errors occurred.(The SSL connection could not be established.)

1. 背景:系统偶然出现SSL错误,导致程序出现异常,造成数据不完整。

2. 目的:添加重试机制,当出现SSL错误且程序抛异常时,重新执行“接口”,以此解决SSL困扰。

/// <summary>
/// 代码执行失败重试帮助类
/// @Author wangrc
/// @Copy-Right 2022-03-21
/// @Version latest
/// @Getting-Start 参考FailureRetryHelper.TestFailureRetryHelper()
/// </summary>
public class FailureRetryHelper
{
/// <summary>
/// 使用示例
/// </summary>
public static async void TestFailureRetryHelper()
{
//创建一个空日志记录
ILogger logger = null;
//示例1
FailureRetryHelper.RetryRemote<string>(() =>
{
return "Test";
}, 10, 200, logger);
//注:示例1等价于 private string Test(){return "Test";}
FailureRetryHelper.RetryRemote(Test, 10, 200);
//FailureRetryHelper.RetryRemote<string>(Test, 10, 200, logger);
//示例2
FailureRetryHelper.RetryRemote(() =>
{
int i = 0;
}, 10, 200, logger);
//示例3
await FailureRetryHelper.RetryRemoteAsync(async () =>
{
return await Task.Run(()
=> { return Task.FromResult("Test"); });
}, 10, 200, logger);
//示例4
await FailureRetryHelper.RetryRemoteAsync(async () =>
{
await Task.Run(() => {
Task.FromResult("Test"); });
}, 10, 200, logger);
}
//private static string Test() { return "Test"; }
/// <summary>
/// -失败重试
/// -有返回值/// -同步
/// </summary>
/// <param name="func">执行的方法</param>
/// <param name="time">重试次数</param>
/// <param name="timeWait">等待时间</param>
/// <param name="logger">日志记录-可选</param>
/// <returns></returns>
public static T RetryRemote<T>(Func<T> func, int time, int timeWait, ILogger
logger = null)
{
for (var i = 0; i < time; i++)
{
try
{
var result = func();
return result;
}
catch (Exception ex)
{
Thread.Sleep(timeWait);
if (logger != null)
logger.LogInformation($"请求失败,开始重试 -第 {i} 次尝试,异常信
息:{ex}");
}
}
throw new Exception($"Http请求失败,重试次数{time}");
}

使用方法:在调用api接口(POST/GET/PUT/DELETE)的方法里调用重试帮助方法。
以下我单独对Delete方法举例:

在MAUI中,如果使用HttpClient访问接口遇到"Connection failure"错误,然后第二次访问却成功,这可能是由于以下几种可能的原因: 1. **连接池问题**[^1]:HttpClient通常会维护一个连接池来复用已建立的网络连接,减少创建新连接的延迟。第一次请求失败可能是因为连接池中的连接不稳定或者耗尽,导致新建连接尝试。第二次访问由于新的连接建立了成功,所以能够正常完成。 2. **短暂的网络中断**:网络连接可能会因为短暂的断线或者路由器重置等原因暂不可用,这种情况下,HttpClient会在一段间后自动重试,因此第二次请求就可能成功。 3. **服务器响应超**:第一次请求可能因服务器响应间过长或服务器繁忙而超。HTTP客户端通常会设置一个默认的超间,如果超过这个间还未收到响应,就会认为连接失败。第二次请求如果设置了更长的超或者服务器状态改善,可能会成功。 4. **缓存策略**:某些网络库可能有缓存机制,第一次请求失败后的第二次请求可能会从缓存中获取数据,即使原始接口未响应,也可能显示结果。 要解决这个问题,你可以考虑以下操作: - 检查网络连接稳定性。 - 调整HttpClient的连接超间和重试策略。 - 如果使用的是网络库的默认缓存,确认缓存是否合适,或者关闭缓存以避免干扰。 ```csharp // 示例代码可能涉及设置HttpClient选项 var httpClientHandler = new HttpClientHandler(); httpClientHandler.ConnectTimeout = TimeSpan.FromSeconds(30); // 设置连接超 httpClientHandler.MaxAutomaticRedirections = 3; // 设置最大重定向次数 var httpClient = new HttpClient(httpClientHandler); var response = await httpClient.GetAsync("your-api-url", HttpCompletionOption.ResponseHeadersRead); if (!response.IsSuccessStatusCode) { // 处理错误或重试逻辑 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值