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#中+=是什么意思及+=的用法

    当我们在C#中使用“+=”时,它实际上是一个复合赋值运算符,旨在在现有变量的基础上添加新值。这个符号结合了加号“+”和赋值号“=”,并简化了代码,使其更易读。 使用“+=”的基本语法如下: variable += newValue; 其中,variable是要添加值的变量,newValue是要添加到variable的新值。如果variable中有旧值,则ne…

    C# 2023年6月1日
    00
  • C#中的checksum计算公式

    接下来我将为您详细讲解C#中的checksum计算公式的完整攻略。在计算checksum时,我们通常使用简单的数学算法。具体而言,我们通过将所有字节加起来并对其取模来计算checksum值。因为checksum值的计算方式相对简单,因此我们可以通过自己编写算法来计算checksum值。 以下为C#中的checksum计算公式示例: byte[] bytes …

    C# 2023年6月8日
    00
  • C# CM框架实现多页面管理的实例代码

    以下是详细讲解“C# CM框架实现多页面管理的实例代码”的完整攻略: 1. 什么是C# CM框架 C# CM框架全称是Carsen Management框架,是一种基于Model-View-ViewModel(MVVM)模式开发的移动端框架。它可以帮助开发者快速构建跨平台的移动应用程序。其中,模型(Model)是指应用程序的数据模型,视图(View)是指应用…

    C# 2023年5月31日
    00
  • c#读写App.config,ConfigurationManager.AppSettings 不生效的解决方法

    针对 “c#读写App.config,ConfigurationManager.AppSettings不生效的解决方法” 这个问题,我们可以从以下几个方面入手: 1. 确认App.config格式是否正确 在使用App.config的时候,我们需要确保这个文件名及格式都是正确的,这是一个很容易被忽略的问题。首先,确认你的App.config文件是放在程序的根…

    C# 2023年5月15日
    00
  • asp.net页面中如何获取Excel表的内容

    获取Excel表的内容,需要使用相关的类库和方法。在ASP.NET页面中,一般可以通过以下步骤来获取Excel表的内容: 1.导入相关命名空间和类库 首先需要在代码文件的开头导入相关命名空间和类库,包括: using System.Data; using System.Data.OleDb; 其中,System.Data提供了数据库操作的相关类,而Syste…

    C# 2023年6月6日
    00
  • c#之事件用法

    C#之事件用法攻略 什么是事件? 在 C# 中,事件是一种特殊的委托,通常用于处理对象和组件之间的行为互动。基本上,事件是类或对象的声明,表示当一个操作发生时,程序中某些代码应该被执行。 如何使用事件? 在 C# 中,事件分为以下几个步骤: 定义事件的委托类型 定义事件 注册对事件的关注 触发事件 定义事件的委托类型 定义事件的委托类型,通常使用 Event…

    C# 2023年6月1日
    00
  • C#基础学习系列之Attribute和反射详解

    C#基础学习系列之Attribute和反射详解 什么是 Attribute 和反射 Attribute 也称为特性,在 C# 中起到了一种将元数据与预定义元素进行关联的机制。反射可以让程序在运行时通过查看类型信息,调用对象的方法,或访问属性和字段。 Attribute 的用途 Attribute 主要用在以下场景: 提供给编译器或开发工具使用的注释 在运行时…

    C# 2023年5月31日
    00
  • C# Linq的ElementAt()方法 – 返回序列中指定索引处的元素

    下面是C# Linq的ElementAt()方法的详细讲解和示例: ElementAt()方法的说明 ElementAt()方法是用于从指定集合的指定索引处返回一个元素。它可以接受一个整数作为参数,表示需要返回的元素所在的索引位置。如果索引超出了集合的范围,则会引发ArgumentOutOfRangeException异常。 语法 public static…

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