增加启动时自动初始化逻辑

程序启动时自动调用init接口来初始化ESign的SDK服务
E-Sign
LiJiaWen 2 weeks ago
parent fc0bf769ad
commit fcea814670
  1. 55
      CA-Platform-Linker/Controllers/OnlineHospitalController.cs
  2. 45
      CA-Platform-Linker/Startup.cs
  3. 25
      CA-Platform-Linker/Tools/SdkState.cs

@ -18,29 +18,34 @@ namespace CA_Platform_Linker.Controllers
_onlineHospitalService = onlineHospitalService;
}
[HttpGet]
public async Task<IActionResult> InitSDK()
{
try
{
var result = await _onlineHospitalService.InitSDKAsync();
if (result.errCode == 0)
{
return Ok(ApiResponse.Ok(result.msg));
}
LogHelper.Log.Error($"初始化SDK失败: {result.msg}");
return Ok(ApiResponse.Fail(result.msg));
}
catch (Exception ex)
{
LogHelper.Log.Error($"初始化SDK异常: {ex.Message}");
return Ok(ApiResponse.Fail($"初始化SDK异常: {ex.Message}"));
}
}
// SDK初始化已改为程序启动后自动执行(Startup中启动后台任务,每30秒循环调用init),不再对外暴露
//[HttpGet]
//public async Task<IActionResult> InitSDK()
//{
// try
// {
// var result = await _onlineHospitalService.InitSDKAsync();
// if (result.errCode == 0)
// {
// return Ok(ApiResponse.Ok(result.msg));
// }
// LogHelper.Log.Error($"初始化SDK失败: {result.msg}");
// return Ok(ApiResponse.Fail(result.msg));
// }
// catch (Exception ex)
// {
// LogHelper.Log.Error($"初始化SDK异常: {ex.Message}");
// return Ok(ApiResponse.Fail($"初始化SDK异常: {ex.Message}"));
// }
//}
[HttpPost]
public async Task<IActionResult> SignWithP7([FromBody] EsignSignRequest request)
{
if (!SdkState.IsInitialized)
{
return Ok(ApiResponse.Fail("SDK尚未初始化成功,请稍后重试"));
}
try
{
if (string.IsNullOrEmpty(request.DoctorCode))
@ -77,6 +82,10 @@ namespace CA_Platform_Linker.Controllers
[HttpPost]
public async Task<IActionResult> VerifyP7([FromBody] EsignVerifyRequest request)
{
if (!SdkState.IsInitialized)
{
return Ok(ApiResponse.Fail("SDK尚未初始化成功,请稍后重试"));
}
try
{
if (string.IsNullOrEmpty(request.PlainText))
@ -106,6 +115,10 @@ namespace CA_Platform_Linker.Controllers
[HttpPost]
public async Task<IActionResult> CreatePersonAccount([FromBody] EsignCreatePersonRequest request)
{
if (!SdkState.IsInitialized)
{
return Ok(ApiResponse.Fail("SDK尚未初始化成功,请稍后重试"));
}
try
{
if (string.IsNullOrEmpty(request.DoctorCode))
@ -131,6 +144,10 @@ namespace CA_Platform_Linker.Controllers
[HttpPost]
public async Task<IActionResult> GetIndivAuthUrl([FromBody] EsignIndivAuthRequest request)
{
if (!SdkState.IsInitialized)
{
return Ok(ApiResponse.Fail("SDK尚未初始化成功,请稍后重试"));
}
try
{
if (string.IsNullOrEmpty(request.DoctorCode))

@ -81,6 +81,51 @@ namespace CA_Platform_Linker
{
endpoints.MapControllers();
});
// 启动后台任务:每30秒重试初始化SDK,初始化成功后结束任务并开放接口调用
StartSdkInitTask(app.ApplicationServices);
}
/// <summary>
/// 启动SDK初始化后台任务:第一次先等30秒再调用init,失败则每30秒重试,成功即结束
/// </summary>
private void StartSdkInitTask(IServiceProvider services)
{
System.Threading.Tasks.Task.Run(async () =>
{
LogHelper.Log.Info("SDK初始化任务已启动,将在30秒后开始第一次调用");
// 第一次进入循环时先等30秒
await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(30));
int retryCount = 0;
while (true)
{
retryCount++;
string now = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
LogHelper.Log.Info($"[第{retryCount}次初始化尝试] 开始时间: {now}");
try
{
var service = services.GetRequiredService<IOnlineHospitalService>();
var result = await service.InitSDKAsync();
if (result.errCode == 0)
{
SdkState.SetInitialized(true);
LogHelper.Log.Info($"[第{retryCount}次初始化尝试] 成功,完成时间: {System.DateTime.Now:yyyy-MM-dd HH:mm:ss},已开放接口调用,结束初始化任务");
return;
}
LogHelper.Log.Warn($"[第{retryCount}次初始化尝试] 失败,时间: {now},errCode: {result.errCode},失败原因: {result.msg},将在30秒后重试");
}
catch (System.Exception ex)
{
LogHelper.Log.Error($"[第{retryCount}次初始化尝试] 异常,时间: {now},异常类型: {ex.GetType().Name},异常信息: {ex.Message},将在30秒后重试");
}
LogHelper.Log.Info($"等待30秒后开始第{retryCount + 1}次尝试,预计时间: {System.DateTime.Now.AddSeconds(30):yyyy-MM-dd HH:mm:ss}");
await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(30));
}
});
}
}
}

@ -0,0 +1,25 @@
using System.Threading;
namespace CA_Platform_Linker.Tools
{
/// <summary>
/// SDK初始化状态管理
/// </summary>
public static class SdkState
{
private static int _isInitialized = 0;
/// <summary>
/// SDK是否已初始化成功
/// </summary>
public static bool IsInitialized => _isInitialized == 1;
/// <summary>
/// 标记SDK初始化状态
/// </summary>
public static void SetInitialized(bool initialized)
{
Interlocked.Exchange(ref _isInitialized, initialized ? 1 : 0);
}
}
}
Loading…
Cancel
Save