概述:在.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