ASP.NET количество срабатываний обработчика равно к-ву запросов к контроллеру

Рейтинг: 0Ответов: 0Опубликовано: 29.03.2023

Всем привет! Много текста извиняюсь.

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 , подскажите пожалуйста как это делать по-человечески. Может совсем не на верном пути. Делаю бота.

Ответы

Ответов пока нет.