Я пытаюсь создать приложение, которое может получать запросы 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 в промежуточном программном обеспечении, я могу отправить сообщение через контроллер.
Но в итоге мне нужно держать соединение открытым во время отправки и получения в этой процедуре.