ASP.NET количество срабатываний обработчика равно к-ву запросов к контроллеру
Всем привет! Много текста извиняюсь.
ASP.NET CORE 7.0/ Discord.Net
Мой сервер принимает запросы от VK.COM через контроллер. Далее нужные данные через объект ставится в очередь. После приложение ожидает пока не сработает событие в discorClient.MessageRecived, которое проверит очередь и удалит из нее некий объект.
Сам discordClient зарегистрирован в Startup.cs как Singlton
//--Startup.cs
var discordConfig = new DiscordSocketConfig();
discordConfig.GatewayIntents = GatewayIntents.AllUnprivileged | GatewayIntents.MessageContent;
var discordClient = new DiscordSocketClient(discordConfig);
discordClient.LoginAsync(TokenType.Bot, {KEY}).Wait();
discordClient.StartAsync().Wait();
В контроллере внедрен через DI - discordClient, после чего я создаю событие discordClient+=discordClient.MessageRecived
Проблема в том, что оно срабатывает не 1н раз, а столько, сколько запросов к контроллеру было. Например 5.
//--CallbackController
[Route("api/[controller]")]
[ApiController]
public class CallbackController : ControllerBase
{
private readonly IVkApi _vkApi;
private DiscordSocketClient _discordClient;
public CallbackController(IConfiguration configuration,IVkApi vkApi)
{
_configuration = configuration;
_vkApi = vkApi;
_discordClient = discordClient;
_discordClient+=discordClient.MessageRecived
}
[HttpPost]
public async Task<IActionResult> Callback([FromBody] JObject data)
{
switch (data?["type"]?.ToString())
{
case "message_new":
{
MessageNew messageData = data?["object"]?.ToObject<MessageNew>()
var pictureRequest = new PictureRequest
{
prompt = messageData.Message.Text,
Id = messageData.Message.FromId
};
_pictureRequests.Add(pictureRequest);
//--------------------
private async Task _discordClient_MessageReceived(SocketMessage message) // выполняется X-раз
{
if (message.Author.Id == IDCHANNEL)
{
foreach (var request in _pictureRequests)
{
if (message.CleanContent == request.prompt)
{
SendMJ(request.Id, request.prompt, message.imageUrl);
_pictureRequests.Remove(request);
break;
}
}
}
}
return;
}
}
Получается, что оно создается заодно с запросом. Какой тут выход? Создать отдельный класс DiscordMessageHandler в него передать _client и в нём создать обработчик, и потом уже этот класс зарегать как синглтон?
Тогда как передавать данные из контроллера внутрь обработчика?
В целом очень просто должно быть приложение - получил запрос, поставил очередь. Жду обработчик. Ищу совпадения и удаляю из очереди.
Я первый раз залез в ASP.NET , подскажите пожалуйста как это делать по-человечески. Может совсем не на верном пути. Делаю бота.