C# 在ASP.NET Core中安全地在控制器之间共享列表
我正在使用ASP.NETCore3.1。我正在编写一个控制器来处理Webhook,发送请求的系统可能会多次发送相同的请求。每个请求都有一个通知ID头,该头对于重复的请求是相同的,因此很容易将它们过滤掉 在ASP.NET内核中处理此问题的最佳方法是什么,它是线程安全的?现在我正在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
内存缓存中存储一个列表
,它可以工作,但我担心线程安全。我不知道像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是线程安全的