.net Core中如何限制接口请求次数

.net core中如何限制接口请求次数

AspNetCoreRateLimit这种轮子我前面有给大家介绍过,今天就不说了,我们来聊聊背后的原理,欢迎各位大佬指正!

像我们经常看的一些APi请求接口网站:

ad8ce4077897bd00cbdcaca446a488b2.png

拿请求国外主要城市的七日接口举例,非VIP只能使用2000次, vip用户一天最多请求10000次,请求该接口时,必须要注册账号获取到appid和密钥。

那我们根据这个需求,设计一个获取天气的限流接口。

第一步

校验登录账号是否存在,如果不存在,我们抛出不存在的错误

[HttpPost("GetWeather")]
 public IActionResult ApiLimit(WeatherInfor weatherInfor)
  {
  if (!_userService.IsValid(weatherInfor.Appid, weat   herInfor.Appsecret))
   {
    throw new Exception("账号或者密码错误");
   }
   }
第二步

判断该账户是否是Vip用户,如果是VIP用户,则没有调用总次数,只有单日限制次数,像这种单日限制次数,隔天清空的数据 我们肯定用缓存来处理比较合理,我们设置每天的23点59分59秒所有请求缓存是否有效,这就是缓存的绝对过期时间。

那具体业务逻辑就是这样的 由于用户的appid是唯一的,我们可以把它当作key值,调用的次数当作value值,如果缓存不存在我们就添加缓存,如果缓存存在 我们就获取调用次数,如果大于2000我们就告诉调用方,调用次数已用完,如果没有 我们就从缓存中获取调用的次数,并给它+1。

缓存类

public class MemoryCacheHelper
    {

        public static MemoryCache _cache = new MemoryCache(new MemoryCacheOptions());

        /// <summary>
        /// 验证缓存项是否存在
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <returns></returns>
        public static bool Exists(string key)
        {
            if (key == null)
            {
                return false;
            }
            return _cache.TryGetValue(key, out _);
        }

        /// <summary>
        /// 获取缓存
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <returns></returns>
        public static object Get(string key)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }
            if (!Exists(key))
                throw new ArgumentNullException(nameof(key));


            return _cache.Get(key);
        }

        /// <summary>
        /// 添加缓存
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <param name="value">缓存Value</param>
        /// <param name="expiresSliding">滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
        /// <param name="expiressAbsoulte">绝对过期时长</param>
        /// <returns></returns>
        public static bool AddMemoryCache(string key, object value)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }
            DateTime time = Convert.ToDateTime(DateTime.Now.AddDays(1).ToString("D").ToString()).AddSeconds(-1);
            _cache.Set(key, value, time);
            return Exists(key);
        }
    }

业务逻辑

public bool IsLimit(string appId)
        {
            if (MemoryCacheHelper.Exists(appId))
            {
                int value = int.Parse(MemoryCacheHelper.Get(appId).ToString());
                if (value > 2000)
                    return false;
                else
                    value = value + 1;

                MemoryCacheHelper.AddMemoryCache(appId, value);
            }
            else
            {
                MemoryCacheHelper.AddMemoryCache(appId, 1);
            }
            return true;
        }
最后

去查询天气接口, 返回数据

[HttpPost("GetWeather")]
        public IActionResult ApiLimit(WeatherInfor weatherInfor)
        {
            if (!_userService.IsValid(weatherInfor.Appid, weatherInfor.Appsecret))
            {
                throw new Exception("账号或者密码错误");
            }
            bool isLimit = false;
            if (_userService.IsVIP(weatherInfor.Appid))
            {
                isLimit= _sqlServices.IsLimit(weatherInfor.Appid);
            }
            else
            {
                isLimit = _memoryCacheServices.IsLimit(weatherInfor.Appid);
            }
            if (isLimit)
            {
                //查询天气接口 返回数据
            }
            else
            {
                throw new Exception("调用次数已用完");
            }
            return Ok("");
        }

最后大家如果喜欢我的文章,还麻烦给个关注并点个赞, 希望net生态圈越来越好!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,您需要在ASP.NET Core项目添加Microsoft.AspNetCore.Http和Microsoft.AspNetCore.StaticFiles包。然后在您的控制器添加以下代码: ```csharp [HttpPost] [Route("api/uploadvideo")] public async Task<IActionResult> UploadVideo(IFormFile file) { if (file == null || file.Length == 0) { return BadRequest("File not selected."); } // Set the path where the video will be stored var path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "videos", file.FileName); // Create the file in the specified path using (var stream = new FileStream(path, FileMode.Create)) { await file.CopyToAsync(stream); } return Ok("Video uploaded successfully."); } ``` 在这个示例,我们使用`HttpPost`属性来指定这是一个POST请求,并使用`Route`属性来设置API的路由。我们还使用`IFormFile`类型的参数来接收上传的视频文件。 在方法,我们首先检查文件是否存在,如果不存在,则返回`BadRequest`结果。如果文件存在,则使用`Path.Combine`方法创建文件的保存路径。接着,我们使用`FileStream`类创建文件流,并使用`CopyToAsync`方法从上传文件流复制数据到指定的文件流。最后,我们使用`Ok`方法返回上传成功的消息。请注意,我们将视频文件存储在`wwwroot`文件夹,这是ASP.NET Core应用程序的默认静态文件目录。 当用户使用POST请求上传视频时,他们可以使用类似于以下示例的代码: ```html <form method="post" enctype="multipart/form-data" action="/api/uploadvideo"> <input type="file" name="file" /> <button type="submit">Upload Video</button> </form> ``` 在这个示例,我们使用`enctype="multipart/form-data"`属性来指定这是一个多部分表单,以便能够上传文件。我们还使用`input`标签的`type="file"`属性来允许用户选择视频文件。最后,我们使用`action`属性来指定上传视频的API路由。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值