Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET Core中安全地在控制器之间共享列表_C#_Asp.net Core_Caching_.net Core - Fatal编程技术网

C# 在ASP.NET Core中安全地在控制器之间共享列表

C# 在ASP.NET Core中安全地在控制器之间共享列表,c#,asp.net-core,caching,.net-core,C#,Asp.net Core,Caching,.net Core,我正在使用ASP.NETCore3.1。我正在编写一个控制器来处理Webhook,发送请求的系统可能会多次发送相同的请求。每个请求都有一个通知ID头,该头对于重复的请求是相同的,因此很容易将它们过滤掉 在ASP.NET内核中处理此问题的最佳方法是什么,它是线程安全的?现在我正在内存缓存中存储一个列表,它可以工作,但我担心线程安全。我不知道像collection这样的线程安全列表会提供类似.Contains()的功能来快速检查集合中是否存在某些内容 处理这种情况的最佳方法是什么?我建议使用just

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

在ASP.NET内核中处理此问题的最佳方法是什么,它是线程安全的?现在我正在
内存缓存中存储一个
列表
,它可以工作,但我担心线程安全。我不知道像collection这样的线程安全列表会提供类似
.Contains()
的功能来快速检查集合中是否存在某些内容

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

我建议使用just。没有集合对象

这样,您可以对缓存对象的生存期进行一些控制。例如,你只能保存一个小时

[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实例,并且不打算水平扩展它,那么这种方法是有意义的

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

否则,需要一个。我建议只使用一个。没有集合对象

这样,您可以对缓存对象的生存期进行一些控制。例如,你只能保存一个小时

[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实例,并且不打算水平扩展它,那么这种方法是有意义的

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


否则,需要一个通知。ConcurrentDictionary和通知ID是否会成为您的一项关键工作?此方法不可扩展,但您正在寻找的集合是ConcurentDictionary@PavelShastov我是否需要对
MemoryCache
执行特殊操作?不,MemoryCache是一个线程安全的ConcurrentDictionary,通知ID是您的关键工作?这种方法不可扩展,但您正在寻找的集合是ConcurentDictionary@PavelShastov我是否需要对
MemoryCache
执行特殊操作?不,MemoryCache是线程安全的