【问题标题】:Sharing a list between controllers safely in ASP.NET Core在 ASP.NET Core 中安全地在控制器之间共享列表
【发布时间】:2023-03-03 17:38:02
【问题描述】:

我正在使用 ASP.NET Core 3.1。我正在编写一个控制器来处理 webhook,发送请求的系统可能会多次发送相同的请求。每个请求都有一个通知 ID 标头,重复请求的标头相同,因此很容易将它们过滤掉。

在正确线程安全的 ASP.NET Core 中处理此问题的最佳方法是什么?现在我将List<string> 存储在MemoryCache 中,它可以工作,但我担心线程安全。我不知道有一个线程安全的类似列表的集合,它提供类似.Contains() 的东西来快速检查集合中是否存在某些东西。

处理这种情况的最佳方法是什么?

【问题讨论】:

  • ConcurrentDictionary 将通知 ID 作为密钥对您有用吗?
  • 这种方法无法扩展,但您要查找的集合是 ConcurentDictionary
  • @PavelShastov 我需要对MemoryCache 做一些特别的事情吗?
  • 不,MemoryCache 是线程安全的

标签: c# asp.net-core caching .net-core


【解决方案1】:

我建议只使用Asp.Net Core IMemoryCache。没有集合对象。

通过这种方式,您可以对缓存对象的生命周期进行一些控制。例如,您可以只保留一小时。

[ApiController]
public class HomeController : Controller
{
    private readonly IMemoryCache _cache;

    public HomeController(IMemoryCache memoryCache)
    {
        _cache = memoryCache;
    }

    public ActionResult Get(string notificationId)
    {
        if (_cache.TryGetValue(notificationId, out _))
            return Ok();

        // Do stuff

        // Store key for one hour
        _cache.Set(notificationId, notificationId, TimeSpan.FromHours(1));

        return Ok();
    }
}

警告!

如果您只有一个 webhook 实例并且您不打算水平扩展它,那么这种方法是有意义的。

或者,如果您对每个实例都有自己的缓存并可能每个实例处理一次相同的请求感到满意。

否则,distributed caching 是必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 2014-03-22
    • 1970-01-01
    相关资源
    最近更新 更多