.Net Core WebSockets, связь между контроллером MVC и WebSocket - PullRequest
0 голосов
/ 10 октября 2019

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

Мне удается сделать все, кроме ответа обратно на контроллер API, который получил первый запрос.

Я использую промежуточное программное обеспечение websocket, мне нужно поддерживать клиентов подключенными и отправлять запросы на них по адресув любой момент времени.

Это выполнимо, и если это лучший подход для обработки этого моста?

Мой middleware main

public async Task InvokeAsync(HttpContext context)
        {

            // we can verify the request params with this method.
            //WriteRequestParam(context);

            // Skip using websocket if it's not a websocket request.
            // It's here where we'll implement the logic for api requests to be sent to the websocket.
            if (context.WebSockets.IsWebSocketRequest)
            {

                Console.WriteLine("Websocket connected");

                //Assigns a guid for the websocket
                string connID = _manager.AddSocket(await context.WebSockets.AcceptWebSocketAsync());
                await SendConnIDAsync(_manager.GetSocket("1"), connID);
                
            }
            else
            {
      
                await _next(context);

            }

        }

Мой метод контроллера, в котором я его тестирую.

 [HttpGet("{id}")]
        public async Task<ActionResult<string>> Get(int id)
        {

            string resultToReturn = string.Empty;

            //here I lose the conncetion with the websocket, it says the connection was closed
            await _manager.SendRequestToClient("test");
            await _manager.ReceiveMessageAsync(async (result, buffer) =>
            {

                switch (result.MessageType)
                {
                    case WebSocketMessageType.Text:

                        resultToReturn = Encoding.UTF8.GetString(buffer, 0, result.Count);
                        Console.WriteLine($"Message received: {resultToReturn}");

                        break;

                    case WebSocketMessageType.Close:

                        Console.WriteLine("Received close message");

                        await _manager.CloseWebSocketAsync(result);

                        break;
                }
            });

            return resultToReturn;
        }

У меня есть менеджер, обрабатывающий отправку и получение. Но соединение начинается с промежуточного программного обеспечения. Если я сохраняю await receiveMsg в промежуточном программном обеспечении, я могу отправить сообщение через контроллер.

Но в итоге мне нужно держать соединение открытым во время отправки и получения в этой процедуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...