概述:在.NET Core中,通過創建RequestCountMiddleware中間件,結合MemoryCache,實現了記錄最近5分鐘請求次數的功能。該中間件在每個請求中更新計數,並使用緩存存儲,為簡單而實用的請求監控提供了一個示例。 要實現一個在.NET Core中記錄最近5分鐘請求次數的Re ...
概述:在.NET Core中,通過創建RequestCountMiddleware中間件,結合MemoryCache,實現了記錄最近5分鐘請求次數的功能。該中間件在每個請求中更新計數,並使用緩存存儲,為簡單而實用的請求監控提供了一個示例。
要實現一個在.NET Core中記錄最近5分鐘請求次數的RequestCountMiddleware,你可以按照以下步驟操作。在這個例子中,我們將使用MemoryCache來存儲請求計數。
- 創建中間件類:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Caching.Memory;
using System;
using System.Threading.Tasks;
public class RequestCountMiddleware
{
private readonly RequestDelegate _next;
private readonly IMemoryCache _memoryCache;
public RequestCountMiddleware(RequestDelegate next, IMemoryCache memoryCache)
{
_next = next ?? throw new ArgumentNullException(nameof(next));
_memoryCache = memoryCache ?? throw new ArgumentNullException(nameof(memoryCache));
}
public async Task InvokeAsync(HttpContext context)
{
// 獲取當前時間的分鐘部分,以便將請求計數與時間關聯
var currentMinute = DateTime.UtcNow.ToString("yyyyMMddHHmm");
// 從緩存中獲取當前分鐘的請求計數,如果不存在則初始化為0
var requestCount = _memoryCache.GetOrCreate(currentMinute, entry =>
{
entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5);
return 0;
});
// 增加請求計數
requestCount++;
// 更新緩存中的請求計數
_memoryCache.Set(currentMinute, requestCount);
// 執行下一個中間件
await _next(context);
}
}
- 在Startup.cs中註冊中間件:
在ConfigureServices方法中註冊MemoryCache服務,併在Configure方法中使用UseMiddleware添加RequestCountMiddleware。
using Microsoft.Extensions.DependencyInjection;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 註冊MemoryCache服務
services.AddMemoryCache();
}
public void Configure(IApplicationBuilder app)
{
// 添加RequestCountMiddleware到中間件管道
app.UseMiddleware<RequestCountMiddleware>();
// 其他中間件...
}
}
- 使用中間件:
現在,RequestCountMiddleware將在每個請求中記錄最近5分鐘的請求次數。 測試代碼
[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
private readonly IMemoryCache _memoryCache;
public TestController(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}
public IActionResult Index()
{
var currentMinute = DateTime.UtcNow.ToString("yyyyMMddHHmm");
// 從緩存中獲取當前分鐘的請求計數,如果不存在則初始化為0
var requestCount = _memoryCache.Get<int>(currentMinute);
return Ok($"5分鐘內訪問次數:{requestCount}次");
}
}
運行效果:
請註意,這個示例使用MemoryCache來存儲請求計數,這意味著計數將在應用程式重新啟動時重置。如果需要持久性,可以考慮使用其他存儲方式,如資料庫。
源代碼獲取:
https://pan.baidu.com/s/1To2txIo9VDH2myyM4ecRhg?pwd=6666