AspNetCoreRateLimit应用于MVC项目求助

AspNetCoreRateLimit应用于MVC项目求助

前言

之前发过一篇文章:

.NET Core WebApi接口ip限流实践 - 妙妙屋(zy) - 博客园 (cnblogs.com)

然后应用在前后端分离项目这个组件是非常好用的。但应用于不分离的项目,比如我的个人博客就有点麻烦。

就是我的需求是评论接口限流,然后触发限流后要回到文章页面告诉用户你触发了限流,但是,使用这个组件,他会将返回信息以页面的形式返回给你,我并不知道该如何去让他回到文章页面,也是琢磨了很久,用中间件去实现了这个效果,但是感觉不是很理想,如果有大佬知道更好的办法,可以私信或评论,感激不尽。

实现的效果图

image

评论接口

image

文章接口

image

_messages.Warning是博客开源作者封装的提示信息组件,可以采用别的方式去提示,问题不大。这里就是将从缓存中的提示信息提取出来,然后因为这里用的是缓存,用session做的唯一值处理,所以用session去取出来,如果从缓存中查出来存在,则提示被限流。

代码实现

原理就是把组件自带的信息提示设置为空字符串,自己在中间件中去使用。

这是限流规则:

image

这里参数就不做多的解释,可以去看之前发布的那篇文章。只要把Content设置为空字符串即可。

然后就开始去写中间件去处理触发了限流该怎么做

需要注册缓存服务

builder.Services.AddMemoryCache();

app.Use(async (context, next) =>
{
    var cache = context.RequestServices.GetRequiredService<IMemoryCache>();
    
    // 保存原始响应流
    var originalBody = context.Response.Body;
    
    // 创建一个新的响应流
    using var responseBody = new MemoryStream();
    context.Response.Body = responseBody;
    
    // 加载当前用户的 Session 对象
    await context.Session.LoadAsync();
    
    await next.Invoke();
    
    if (context.Response.StatusCode == 429)
    {
        var referer = context.Request.Headers["Referer"].ToString();
        
        // 从 Session 中获取一个字符串值
        var value = context.Session.GetString("key");
        if (string.IsNullOrEmpty(value))
        {
            // 如果 Session 中没有值,则设置一个字符串值
            context.Session.SetString("key", "value");
        }
        var sessionId = context.Session.Id;
        if (!cache.TryGetValue("Errors", out Dictionary<string, string> errors))
        {
            errors = new Dictionary<string, string>();
            cache.Set("Errors", errors, TimeSpan.FromSeconds(10));
        }
        
        errors[sessionId] = "您的请求已被限流,请稍后再试。";
        
        // 重置响应流位置
        responseBody.Seek(0, SeekOrigin.Begin);
        
        // 读取响应内容
        // var bodyText = new StreamReader(responseBody).ReadToEnd();
        
        // 设置新的响应流
        context.Response.Body = originalBody;
        
        // 设置新的响应状态码
        context.Response.StatusCode = 302;

        context.Response.Headers["Location"] = referer;
        
    }
    else
    {
        // 将响应流写回到原始响应流中
        responseBody.Seek(0, SeekOrigin.Begin);
        await responseBody.CopyToAsync(originalBody);
        
    }
});

注意这个中间件处理要放在app.UseRateLimit();前面。

结尾

AspNetCoreRateLimit原本就讲限流的ip存放在redis当中了的,但是我就是查不出来,如果能用该组件自带的方法查询出来,就不需要再写一个中间件,当429的时候再用缓存存一次会话了。

总之暂且先用这种办法吧,如果有更好的方法可以评论哟~

原文链接:https://www.cnblogs.com/ZYPLJ/archive/2023/05/07/17380401.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:AspNetCoreRateLimit应用于MVC项目求助 - Python技术站

(0)
上一篇 2023年5月8日
下一篇 2023年5月8日

相关文章

  • C# 三种方式实现Socket数据接收

    C#是一种基于对象的程序设计语言,可以使用它来实现Socket数据接收。在C#中,Socket可以通过三种方式进行数据接收,分别是:同步方式、异步方式和事件驱动方式。 同步方式 同步方式是一种阻塞式的接收方式,即程序执行在接收Socket数据的阶段会一直阻塞,直到数据接收完成后程序才会继续执行。 代码示例: using System; using Syste…

    C# 2023年5月15日
    00
  • C#实现延时并自动关闭MessageBox的方法

    这里给出C#实现延时并自动关闭MessageBox的方法的完整攻略: 1. 使用System.Windows.Forms.Timer实现延时关闭 使用System.Windows.Forms.Timer能够方便地实现延时关闭MessageBox的功能。具体步骤如下: 1.1 准备工作 先添加命名空间 using System.Windows.Forms; 1…

    C# 2023年5月15日
    00
  • 分享一个asp.net pager分页控件

    Asp.NetPager是一个.NET平台上的分页控件,可以方便地实现分页功能。以下是使用Asp.NetPager实现分页功能的完整攻略。 环境准备 在使用Asp.NetPager前,需要安装Asp.NetPager包。可以使用以下命令来安装Asp.NetPager: Install-Package AspNetPager 实现分页功能 以下是使用Asp.N…

    C# 2023年5月15日
    00
  • C# WinForm 登录界面的图片验证码(区分大小写+不区分大小写)

    下面是详细讲解 “C# WinForm 登录界面的图片验证码(区分大小写+不区分大小写)” 的完整攻略: 1. 准备工作 在开始编写代码前,我们需要准备以下工作: 安装开发环境 Visual Studio,并创建一个 WinForm 程序 准备一张用于生成验证码的图片 2. 编写生成验证码的代码 我们可以通过 System.Drawing 命名空间下的 Gr…

    C# 2023年6月8日
    00
  • C# File.Delete(string path):删除指定文件

    File.Delete(string path) 方法是C#中的一个方法,用于删除指定路径(path)上的文件。该方法的使用过程如下: 1. 引入命名空间 C#中需要使用System.IO命名空间下的File类来使用File.Delete()方法,因此需要在代码文件中引入该命名空间,例如: using System.IO; 2. 调用方法 要删除指定路径上的…

    C# 2023年4月19日
    00
  • C#实现排列组合算法完整实例

    C#实现排列组合算法完整实例攻略 本文将详细讲解使用C#编程语言实现排列和组合算法的完整攻略,让读者了解其中的原理和实现方法。 排列和组合算法原理 排列和组合算法是组合数学中的两个重要概念,排列算法是指从n个不同元素中,任取m(m<=n)个元素基于元素排列的方式确定从n个元素中任取m个元素的不同方案数。排列的公式为: Pn^m=n(n-1)(n-2)……

    C# 2023年6月7日
    00
  • 提供一个可以将DocX转为doc的文档转换器 地址

    首先需要明确的是,DocX是Word 2007以后版本才有的文件格式,而doc则是早期的版本格式,因此需要将DocX转换为doc格式的情况还是比较常见的。以下是一个可以将DocX转为doc的文档转换器的详细攻略。 1. 确定文档转换器类型 首先需要选择一个可以将DocX转为doc的文档转换器。当前比较常用的转换器有在线转换器和桌面软件两种,我们可以根据实际需…

    C# 2023年5月31日
    00
  • 基于SqlSugar的开发框架循序渐进介绍(27)– 基于MongoDB的数据库操作整合

    SqlSugar的开发框架本身主要是基于常规关系型数据库设计的框架,支持多种数据库类型的接入,如SqlServer、MySQL、Oracle、PostgreSQL、SQLite等数据库,非关系型数据库的MongoDB数据库也可以作为扩展整合到开发框架里面,通过基类的继承关系很好的封装了相关的基础操作功能,极大的减少相关处理MongoDB的代码,并提供很好的开…

    C# 2023年4月19日
    00
合作推广
合作推广
分享本页
返回顶部