Безопасный обмен списком между контроллерами в ASP. NET Core - PullRequest
1 голос
/ 17 февраля 2020

Я использую ASP. NET Core 3.1. Я пишу контроллер для обработки веб-хуков, и вполне возможно, что система, отправляющая запросы, может отправлять один и тот же запрос несколько раз. Каждый запрос имеет заголовок идентификатора уведомления, который будет одинаковым для повторяющихся запросов, поэтому их легко отфильтровать.

Какой лучший способ справиться с этим в ASP. NET Ядро, которое правильно работает безопасно? Прямо сейчас я храню List<string> в MemoryCache, и это работает, но я беспокоюсь о безопасности потоков. Я не знаю поточно-ориентированной коллекции списков, которая предлагает что-то вроде .Contains(), чтобы быстро проверить, существует ли что-то в коллекции.

Какой лучший способ справиться с этой ситуацией?

1 Ответ

0 голосов
/ 21 февраля 2020

Я бы предложил использовать только 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, и вы не собираемся масштабировать его по горизонтали.

Или если у вас все в порядке с каждым экземпляром, имеющим собственный кэш и потенциально обрабатывающим один и тот же запрос один раз для каждого экземпляра.

В противном случае требуется распределенное кэширование .

...