请求频繁验证
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
1959045ab2
commit
3292b9f978
|
|
@ -1,6 +1,7 @@
|
||||||
using IRaCIS.Core.API;
|
using IRaCIS.Core.API;
|
||||||
using IRaCIS.Core.API.HostService;
|
using IRaCIS.Core.API.HostService;
|
||||||
using IRaCIS.Core.Application.BusinessFilter;
|
using IRaCIS.Core.Application.BusinessFilter;
|
||||||
|
using IRaCIS.Core.Application.BusinessFilter.LegacyController.Database.Api;
|
||||||
using IRaCIS.Core.Application.Filter;
|
using IRaCIS.Core.Application.Filter;
|
||||||
using IRaCIS.Core.Application.MassTransit.Consumer;
|
using IRaCIS.Core.Application.MassTransit.Consumer;
|
||||||
using IRaCIS.Core.Application.Service;
|
using IRaCIS.Core.Application.Service;
|
||||||
|
|
@ -100,6 +101,7 @@ builder.Services.AddControllers(options =>
|
||||||
options.Filters.Add<UnitOfWorkFilter>();
|
options.Filters.Add<UnitOfWorkFilter>();
|
||||||
options.Filters.Add<LimitUserRequestAuthorization>();
|
options.Filters.Add<LimitUserRequestAuthorization>();
|
||||||
options.Filters.Add<TrialGlobalLimitActionFilter>();
|
options.Filters.Add<TrialGlobalLimitActionFilter>();
|
||||||
|
options.Filters.Add<RequestDuplicationFilter>();
|
||||||
|
|
||||||
})
|
})
|
||||||
.AddNewtonsoftJsonSetup(builder.Services); // NewtonsoftJson 序列化 处理
|
.AddNewtonsoftJsonSetup(builder.Services); // NewtonsoftJson 序列化 处理
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ public static class ServiceCollectionSetup
|
||||||
services.AddOptions().Configure<AliyunOSSOptions>(_configuration.GetSection("AliyunOSS"));
|
services.AddOptions().Configure<AliyunOSSOptions>(_configuration.GetSection("AliyunOSS"));
|
||||||
services.AddOptions().Configure<ObjectStoreServiceOptions>(_configuration.GetSection("ObjectStoreService"));
|
services.AddOptions().Configure<ObjectStoreServiceOptions>(_configuration.GetSection("ObjectStoreService"));
|
||||||
services.AddOptions().Configure<IRCEncreptOption>(_configuration.GetSection("EncrypteResponseConfig"));
|
services.AddOptions().Configure<IRCEncreptOption>(_configuration.GetSection("EncrypteResponseConfig"));
|
||||||
|
services.AddOptions().Configure<RequestDuplicationOptions>(_configuration.GetSection("RequestDuplicationOptions"));
|
||||||
services.AddOptions().Configure<SystemPacsConfig>(_configuration.GetSection("SystemPacsConfig"));
|
services.AddOptions().Configure<SystemPacsConfig>(_configuration.GetSection("SystemPacsConfig"));
|
||||||
services.Configure<IRaCISBasicConfigOption>(_configuration.GetSection("IRaCISBasicConfig"));
|
services.Configure<IRaCISBasicConfigOption>(_configuration.GetSection("IRaCISBasicConfig"));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,13 @@
|
||||||
"CompanyShortName": "Extensive Imaging",
|
"CompanyShortName": "Extensive Imaging",
|
||||||
"CompanyShortNameCN": "展影医疗",
|
"CompanyShortNameCN": "展影医疗",
|
||||||
"IsEnv_US": false
|
"IsEnv_US": false
|
||||||
|
},
|
||||||
|
"RequestDuplicationOptions": {
|
||||||
|
"IsEnabled": true,
|
||||||
|
"DuplicationWindowMs": 500,
|
||||||
|
"CacheTimeSeconds": 5,
|
||||||
|
"ExcludedPaths": [
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,12 @@
|
||||||
"SystemPacsConfig": {
|
"SystemPacsConfig": {
|
||||||
"Port": "11113",
|
"Port": "11113",
|
||||||
"IP": "101.132.193.237"
|
"IP": "101.132.193.237"
|
||||||
|
},
|
||||||
|
"RequestDuplicationOptions": {
|
||||||
|
"IsEnabled": true,
|
||||||
|
"DuplicationWindowMs": 500,
|
||||||
|
"CacheTimeSeconds": 5,
|
||||||
|
"ExcludedPaths": [
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -160,5 +160,16 @@
|
||||||
"Port": "11113",
|
"Port": "11113",
|
||||||
// PACS服务器IP地址
|
// PACS服务器IP地址
|
||||||
"IP": "106.14.89.110"
|
"IP": "106.14.89.110"
|
||||||
|
},
|
||||||
|
// 重复请求配置
|
||||||
|
"RequestDuplicationOptions": {
|
||||||
|
// 是否启用重复请求检测
|
||||||
|
"IsEnabled": true,
|
||||||
|
// 重复请求时间窗口(毫秒)
|
||||||
|
"DuplicationWindowMs": 500,
|
||||||
|
// 缓存请求时间(秒)
|
||||||
|
"CacheTimeSeconds": 5,
|
||||||
|
"ExcludedPaths": [
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -91,5 +91,12 @@
|
||||||
"SystemPacsConfig": {
|
"SystemPacsConfig": {
|
||||||
"Port": "11113",
|
"Port": "11113",
|
||||||
"IP": "106.14.89.110"
|
"IP": "106.14.89.110"
|
||||||
|
},
|
||||||
|
"RequestDuplicationOptions": {
|
||||||
|
"IsEnabled": true,
|
||||||
|
"DuplicationWindowMs": 500,
|
||||||
|
"CacheTimeSeconds": 5,
|
||||||
|
"ExcludedPaths": [
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -85,6 +85,13 @@
|
||||||
"SystemPacsConfig": {
|
"SystemPacsConfig": {
|
||||||
"Port": "104",
|
"Port": "104",
|
||||||
"IP": "44.210.231.169"
|
"IP": "44.210.231.169"
|
||||||
|
},
|
||||||
|
"RequestDuplicationOptions": {
|
||||||
|
"IsEnabled": true,
|
||||||
|
"DuplicationWindowMs": 500,
|
||||||
|
"CacheTimeSeconds": 5,
|
||||||
|
"ExcludedPaths": [
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -92,6 +92,13 @@
|
||||||
"SystemPacsConfig": {
|
"SystemPacsConfig": {
|
||||||
"Port": "104",
|
"Port": "104",
|
||||||
"IP": "3.226.182.187"
|
"IP": "3.226.182.187"
|
||||||
|
},
|
||||||
|
"RequestDuplicationOptions": {
|
||||||
|
"IsEnabled": true,
|
||||||
|
"DuplicationWindowMs": 500,
|
||||||
|
"CacheTimeSeconds": 5,
|
||||||
|
"ExcludedPaths": [
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -92,6 +92,12 @@
|
||||||
"SystemPacsConfig": {
|
"SystemPacsConfig": {
|
||||||
"Port": "104",
|
"Port": "104",
|
||||||
"IP": "3.226.182.187"
|
"IP": "3.226.182.187"
|
||||||
|
},
|
||||||
|
"RequestDuplicationOptions": {
|
||||||
|
"IsEnabled": true,
|
||||||
|
"DuplicationWindowMs": 500,
|
||||||
|
"CacheTimeSeconds": 5,
|
||||||
|
"ExcludedPaths": [
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -99,6 +99,13 @@
|
||||||
"SystemPacsConfig": {
|
"SystemPacsConfig": {
|
||||||
"Port": "11113",
|
"Port": "11113",
|
||||||
"IP": "101.132.253.119"
|
"IP": "101.132.253.119"
|
||||||
|
},
|
||||||
|
"RequestDuplicationOptions": {
|
||||||
|
"IsEnabled": true,
|
||||||
|
"DuplicationWindowMs": 500,
|
||||||
|
"CacheTimeSeconds": 5,
|
||||||
|
"ExcludedPaths": [
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -74,5 +74,12 @@
|
||||||
"redirect_uri": "https://oauthlogin.net/oauth/githubcallback",
|
"redirect_uri": "https://oauthlogin.net/oauth/githubcallback",
|
||||||
"scope": "repo"
|
"scope": "repo"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"RequestDuplicationOptions": {
|
||||||
|
"IsEnabled": true,
|
||||||
|
"DuplicationWindowMs": 500,
|
||||||
|
"CacheTimeSeconds": 5,
|
||||||
|
"ExcludedPaths": [
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,114 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace IRaCIS.Core.Application.BusinessFilter.LegacyController
|
||||||
|
{
|
||||||
|
using Database.Api;
|
||||||
|
using DocumentFormat.OpenXml.InkML;
|
||||||
|
using IRaCIS.Core.Application.Service.Common;
|
||||||
|
using IRaCIS.Core.Infrastructure;
|
||||||
|
using Microsoft.AspNetCore.Components.Endpoints;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using Minio.Helper;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Database.Api
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 请求拦截 请求前后的操作
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="logger">logger</param>
|
||||||
|
/// <param name="accessor">loggerHelper</param>
|
||||||
|
public class RequestDuplicationFilter(ILogger<RequestDuplicationFilter> logger, IHttpContextAccessor accessor, IUserInfo _userInfo, IStringLocalizer _localizer, IOptionsMonitor<RequestDuplicationOptions> RequestDuplicationOptionsMonitor) : ExceptionFilterAttribute, IAsyncActionFilter
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 传入的参数
|
||||||
|
/// </summary>
|
||||||
|
public string Intoparam { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 这个是正常记录(请求刚进入的时候)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">context</param>
|
||||||
|
/// <param name="next">next</param>
|
||||||
|
/// <returns>返回的对象</returns>
|
||||||
|
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
|
||||||
|
{
|
||||||
|
this.Intoparam = JsonConvert.SerializeObject(context.ActionArguments);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.RequestDuplication();
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var resultContext = await next();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
private void RequestDuplication()
|
||||||
|
{
|
||||||
|
var requestPath = accessor?.HttpContext?.Request?.Path.ToString() ?? string.Empty;
|
||||||
|
|
||||||
|
// 验证请求频繁情况
|
||||||
|
if (_userInfo.UserRoleId != default(Guid)&&
|
||||||
|
RequestDuplicationOptionsMonitor.CurrentValue.IsEnabled &&
|
||||||
|
!RequestDuplicationOptionsMonitor.CurrentValue.ExcludePaths.Contains(requestPath))
|
||||||
|
{
|
||||||
|
RequestInfo requestInfo = new RequestInfo
|
||||||
|
{
|
||||||
|
UserRoleId = _userInfo.UserRoleId,
|
||||||
|
RequestPath = requestPath,
|
||||||
|
ParameterHash = GenerateParameterHash(this.Intoparam),
|
||||||
|
RequestTime = DateTime.Now
|
||||||
|
};
|
||||||
|
|
||||||
|
IRCSystemInfo.RequestRecordList= IRCSystemInfo.RequestRecordList.Where(x => x.RequestTime >= DateTime.Now.AddSeconds(-RequestDuplicationOptionsMonitor.CurrentValue.CacheTimeSeconds)).ToList();
|
||||||
|
|
||||||
|
|
||||||
|
var requestsTimes = IRCSystemInfo.RequestRecordList.Any(x=>
|
||||||
|
x.RequestTime>= requestInfo.RequestTime.AddMilliseconds(-RequestDuplicationOptionsMonitor.CurrentValue.DuplicationWindowMs)&&
|
||||||
|
x.RequestKey== requestInfo.RequestKey);
|
||||||
|
if (requestsTimes)
|
||||||
|
{
|
||||||
|
throw new BusinessValidationFailedException(_localizer["RequestDuplicationFilter_RequestDuplication"]);
|
||||||
|
}
|
||||||
|
IRCSystemInfo.RequestRecordList.Add(requestInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GenerateParameterHash(string parameters)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(parameters))
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
using var sha256 = SHA256.Create();
|
||||||
|
var hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(parameters));
|
||||||
|
return Convert.ToBase64String(hashBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -105,6 +105,54 @@ public class IRCEncreptOption
|
||||||
public List<string> ApiPathList { get; set; }
|
public List<string> ApiPathList { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 请求缓存配置
|
||||||
|
/// </summary>
|
||||||
|
public class RequestDuplicationOptions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 缓存时间(秒),默认5秒
|
||||||
|
/// </summary>
|
||||||
|
public int CacheTimeSeconds { get; set; } = 5;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 重复请求检测时间窗口(毫秒),默认500毫秒
|
||||||
|
/// </summary>
|
||||||
|
public int DuplicationWindowMs { get; set; } = 500;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否启用防重复请求
|
||||||
|
/// </summary>
|
||||||
|
public bool IsEnabled { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 需要排除的路径(不进行重复检测)
|
||||||
|
/// </summary>
|
||||||
|
public List<string> ExcludePaths { get; set; } = new List<string>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class IRCSystemInfo
|
||||||
|
{
|
||||||
|
public static List<RequestInfo> RequestRecordList { get; set; } = new List<RequestInfo>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RequestInfo
|
||||||
|
{
|
||||||
|
public Guid UserRoleId { get; set; }
|
||||||
|
|
||||||
|
public string RequestPath { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
public string ParameterHash { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
public DateTime RequestTime { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 请求的唯一标识
|
||||||
|
/// </summary>
|
||||||
|
public string RequestKey => $"{UserRoleId}_{RequestPath}_{ParameterHash}";
|
||||||
|
}
|
||||||
|
|
||||||
public class IRaCISBasicConfigOption
|
public class IRaCISBasicConfigOption
|
||||||
{
|
{
|
||||||
public string DoctorCodePrefix { get; set; }
|
public string DoctorCodePrefix { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -3233,6 +3233,20 @@
|
||||||
<param name="inDto"></param>
|
<param name="inDto"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.Interface.ILuganoWithoutPETCalculateService.CalculateTargetLesionStatus(IRaCIS.Core.Application.ViewModel.CalculateTargetLesionStatusInDto)">
|
||||||
|
<summary>
|
||||||
|
计算靶病灶状态
|
||||||
|
</summary>
|
||||||
|
<param name="inDto"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.Interface.ILuganoWithoutPETCalculateService.CalculateMergeTargetLesionStatus(IRaCIS.Core.Application.ViewModel.CalculateTargetLesionStatusInDto)">
|
||||||
|
<summary>
|
||||||
|
计算靶病灶融合后状态
|
||||||
|
</summary>
|
||||||
|
<param name="inDto"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.IRECIST1Point1CalculateService.ReadingImport">
|
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.IRECIST1Point1CalculateService.ReadingImport">
|
||||||
<summary>
|
<summary>
|
||||||
阅片导入
|
阅片导入
|
||||||
|
|
@ -13057,7 +13071,7 @@
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.ReadingQuestionService.AddOrUpdateReadingTableQuestionTrial(IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionTrialAddOrEdit)">
|
<member name="M:IRaCIS.Core.Application.Service.ReadingQuestionService.AddOrUpdateReadingTableQuestionTrial(IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionTrialAddOrEdit)">
|
||||||
<summary>
|
<summary>
|
||||||
新增修改想想项目表格问题
|
新增修改项目表格问题
|
||||||
</summary>
|
</summary>
|
||||||
<param name="indto"></param>
|
<param name="indto"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
|
|
@ -13158,7 +13172,7 @@
|
||||||
<param name="inDto"></param>
|
<param name="inDto"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskInstance},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudyFile},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingNoneDicomMark},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.UserLog},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingOncologyTaskInfo},IRaCIS.Core.Application.Service.IVisitTaskHelpeService,IRaCIS.Core.Application.Service.IVisitTaskService,IRaCIS.Core.Application.Contracts.IReadingClinicalDataService,IRaCIS.Core.Application.Service.IReadingCalculateService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.UserFeedBack},Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.ServiceVerifyConfigOption},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingGlobalTaskInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingCriterionPage},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskRelation},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingJudgeInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadModule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.OrganInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.OrganTrialInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialDocument},IRaCIS.Core.Application.Service.ReadingCalculate.Interface.ILuganoCalculateService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionMark},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTrialCriterionDictionary},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableAnswerRowInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableQuestionSystem},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableQuestionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionSystem},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudyFile},IRaCIS.Core.Application.Service.IGeneralCalculateService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskStudy},IRaCIS.Core.Application.Service.ImageAndDoc.IDownloadAndUploadService,IRaCIS.Core.Application.Interfaces.ITrialEmailNoticeConfigService,AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer,ZiggyCreatures.Caching.Fusion.IFusionCache)">
|
<member name="M:IRaCIS.Core.Application.Service.ReadingImageTaskService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskInstance},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudyFile},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingNoneDicomMark},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.UserLog},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingOncologyTaskInfo},IRaCIS.Core.Application.Service.IVisitTaskHelpeService,IRaCIS.Core.Application.Service.IVisitTaskService,IRaCIS.Core.Application.Contracts.IReadingClinicalDataService,IRaCIS.Core.Application.Service.IReadingCalculateService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.UserFeedBack},Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.ServiceVerifyConfigOption},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingGlobalTaskInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingCriterionPage},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskRelation},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingJudgeInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadModule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.OrganInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.OrganTrialInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialDocument},IRaCIS.Core.Application.Service.ReadingCalculate.Interface.ILuganoCalculateService,IRaCIS.Core.Application.Service.ReadingCalculate.Interface.ILuganoWithoutPETCalculateService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionMark},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTrialCriterionDictionary},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableAnswerRowInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableQuestionSystem},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableQuestionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionSystem},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudyFile},IRaCIS.Core.Application.Service.IGeneralCalculateService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskStudy},IRaCIS.Core.Application.Service.ImageAndDoc.IDownloadAndUploadService,IRaCIS.Core.Application.Interfaces.ITrialEmailNoticeConfigService,AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer,ZiggyCreatures.Caching.Fusion.IFusionCache)">
|
||||||
<summary>
|
<summary>
|
||||||
IR影像阅片
|
IR影像阅片
|
||||||
</summary>
|
</summary>
|
||||||
|
|
@ -14398,6 +14412,38 @@
|
||||||
测试加密API 返回的结果
|
测试加密API 返回的结果
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="T:IRaCIS.Core.Application.BusinessFilter.LegacyController.Database.Api.RequestDuplicationFilter">
|
||||||
|
<summary>
|
||||||
|
请求拦截 请求前后的操作
|
||||||
|
</summary>
|
||||||
|
<param name="logger">logger</param>
|
||||||
|
<param name="accessor">loggerHelper</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.BusinessFilter.LegacyController.Database.Api.RequestDuplicationFilter.#ctor(Microsoft.Extensions.Logging.ILogger{IRaCIS.Core.Application.BusinessFilter.LegacyController.Database.Api.RequestDuplicationFilter},Microsoft.AspNetCore.Http.IHttpContextAccessor,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.RequestDuplicationOptions})">
|
||||||
|
<summary>
|
||||||
|
请求拦截 请求前后的操作
|
||||||
|
</summary>
|
||||||
|
<param name="logger">logger</param>
|
||||||
|
<param name="accessor">loggerHelper</param>
|
||||||
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Application.BusinessFilter.LegacyController.Database.Api.RequestDuplicationFilter.Intoparam">
|
||||||
|
<summary>
|
||||||
|
传入的参数
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.BusinessFilter.LegacyController.Database.Api.RequestDuplicationFilter.OnActionExecutionAsync(Microsoft.AspNetCore.Mvc.Filters.ActionExecutingContext,Microsoft.AspNetCore.Mvc.Filters.ActionExecutionDelegate)">
|
||||||
|
<summary>
|
||||||
|
这个是正常记录(请求刚进入的时候)
|
||||||
|
</summary>
|
||||||
|
<param name="context">context</param>
|
||||||
|
<param name="next">next</param>
|
||||||
|
<returns>返回的对象</returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.BusinessFilter.LegacyController.Database.Api.RequestDuplicationFilter.RequestDuplication">
|
||||||
|
<summary>
|
||||||
|
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="T:IRaCIS.Core.Application.BusinessFilter.GlobalExceptionHandler">
|
<member name="T:IRaCIS.Core.Application.BusinessFilter.GlobalExceptionHandler">
|
||||||
<summary>
|
<summary>
|
||||||
minimal api 生效,但是传统控制器,没生效
|
minimal api 生效,但是传统控制器,没生效
|
||||||
|
|
@ -18859,6 +18905,36 @@
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="T:IRaCIS.Core.Domain.Share.RequestDuplicationOptions">
|
||||||
|
<summary>
|
||||||
|
请求缓存配置
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Domain.Share.RequestDuplicationOptions.CacheTimeSeconds">
|
||||||
|
<summary>
|
||||||
|
缓存时间(秒),默认5秒
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Domain.Share.RequestDuplicationOptions.DuplicationWindowMs">
|
||||||
|
<summary>
|
||||||
|
重复请求检测时间窗口(毫秒),默认500毫秒
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Domain.Share.RequestDuplicationOptions.IsEnabled">
|
||||||
|
<summary>
|
||||||
|
是否启用防重复请求
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Domain.Share.RequestDuplicationOptions.ExcludePaths">
|
||||||
|
<summary>
|
||||||
|
需要排除的路径(不进行重复检测)
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Domain.Share.RequestInfo.RequestKey">
|
||||||
|
<summary>
|
||||||
|
请求的唯一标识
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Domain.Models.ReadModuleView.Id">
|
<member name="P:IRaCIS.Core.Domain.Models.ReadModuleView.Id">
|
||||||
<summary>
|
<summary>
|
||||||
Id(阅片期Id 或者 访视ID)
|
Id(阅片期Id 或者 访视ID)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue