private async Task <int> EvaluateAsync(string luaScriptFilePath, RequiresLimitFeatureContext context, CancellationToken cancellation = default) { var luaScriptFile = _virtualFileProvider.GetFileInfo(luaScriptFilePath); using var luaScriptFileStream = luaScriptFile.CreateReadStream(); var fileBytes = await luaScriptFileStream.GetAllBytesAsync(cancellation); var luaSha1 = fileBytes.Sha1(); if (!await _server.ScriptExistsAsync(luaSha1)) { var luaScript = Encoding.UTF8.GetString(fileBytes); luaSha1 = await _server.ScriptLoadAsync(luaScript); } var keys = new RedisKey[1] { NormalizeKey(context) }; var values = new RedisValue[] { context.GetEffectTicks() }; var result = await _redis.ScriptEvaluateAsync(luaSha1, keys, values); if (result.Type == ResultType.Error) { throw new AbpException($"脚本执行错误:{result}"); } return((int)result); }
private string NormalizeKey(RequiresLimitFeatureContext context) { if (_currentTenant.IsAvailable) { return($"{_instance}t:RequiresLimitFeature;t:{_currentTenant.Id};f:{context.LimitFeature}"); } return($"{_instance}c:RequiresLimitFeature;f:{context.LimitFeature}"); }
public virtual async Task <bool> CheckAsync(RequiresLimitFeatureContext context, CancellationToken cancellation = default) { await ConnectAsync(cancellation); var result = await EvaluateAsync(CHECK_LUA_SCRIPT, context, cancellation); return(result + 1 <= context.Limit); }
public virtual string NormalizeFeatureName(string instance, RequiresLimitFeatureContext context) { if (CurrentTenant.IsAvailable) { return($"{instance}t:RequiresLimitFeature;t:{CurrentTenant.Id};f:{context.LimitFeature}"); } return($"{instance}c:RequiresLimitFeature;f:{context.LimitFeature}"); }
public override string NormalizeFeatureName(string instance, RequiresLimitFeatureContext context) { if (CurrentClient.IsAuthenticated) { return(CurrentTenant.IsAvailable ? $"{instance}t:RequiresLimitFeature;t:{CurrentTenant.Id};c:{CurrentClient.Id};f:{context.LimitFeature}" : $"{instance}tc:RequiresLimitFeature;c:{CurrentClient.Id};f:{context.LimitFeature}"); } return(base.NormalizeFeatureName(instance, context)); }
public virtual async Task CheckAsync(RequiresLimitFeatureContext context, CancellationToken cancellation = default) { await ConnectAsync(cancellation); var result = await EvaluateAsync(CHECK_LUA_SCRIPT, context, cancellation); if (result + 1 > context.Limit) { throw new AbpAuthorizationException("已经超出功能次数限制,请联系管理员"); } }
public virtual async Task Check_Limit_Test_Async() { var context = new RequiresLimitFeatureContext(TestFeatureNames.TestLimitFeature, Options, LimitPolicy.Minute, 1, 5); await RequiresLimitFeatureChecker.ProcessAsync(context); await RequiresLimitFeatureChecker.ProcessAsync(context); await RequiresLimitFeatureChecker.ProcessAsync(context); await RequiresLimitFeatureChecker.ProcessAsync(context); await RequiresLimitFeatureChecker.ProcessAsync(context); await Assert.ThrowsAsync <AbpAuthorizationException>(async() => { await RequiresLimitFeatureChecker.CheckAsync(context); }); Thread.Sleep(61000); // it's ok await RequiresLimitFeatureChecker.ProcessAsync(context); }
public virtual async Task Check_Limit_Test_Async() { var context = new RequiresLimitFeatureContext(TestFeatureNames.TestLimitFeature, Options, LimitPolicy.Minute, 1, 5); await RequiresLimitFeatureChecker.ProcessAsync(context); await RequiresLimitFeatureChecker.ProcessAsync(context); await RequiresLimitFeatureChecker.ProcessAsync(context); await RequiresLimitFeatureChecker.ProcessAsync(context); await RequiresLimitFeatureChecker.ProcessAsync(context); var current = await RequiresLimitFeatureChecker.CheckAsync(context); current.ShouldBeFalse(); Thread.Sleep(61000); // it's ok var nowCheckResult = await RequiresLimitFeatureChecker.CheckAsync(context); nowCheckResult.ShouldBeTrue(); }
public virtual async Task ProcessAsync(RequiresLimitFeatureContext context, CancellationToken cancellation = default) { await ConnectAsync(cancellation); await EvaluateAsync(PROCESS_LUA_SCRIPT, context, cancellation); }
public virtual async Task Process_Test_Async() { var context = new RequiresLimitFeatureContext(TestFeatureNames.TestLimitFeature, Options, LimitPolicy.Minute); await RequiresLimitFeatureChecker.ProcessAsync(context); }
private string NormalizeKey(RequiresLimitFeatureContext context) { return(_featureNamingNormalizer.NormalizeFeatureName(_instance, context)); }