Я решил сделать добавление в бд в другом методе класса ChatWebSocketMiddleWare, а именно Invoke(). В нем в параметрах передавался HttpContext, а также решил добавить параметр контекста доступа к бд. Всё стало работать нормально:
public async Task Invoke(HttpContext context, EnterChatContext chatContext)
{
if (!context.WebSockets.IsWebSocketRequest)
{
await _next.Invoke(context);
return;
}
CancellationToken ct = context.RequestAborted;
WebSocket currentSocket = await context.WebSockets.AcceptWebSocketAsync();
var socketId = Guid.NewGuid().ToString();
_sockets.TryAdd(socketId, currentSocket);
while (true)
{
if (ct.IsCancellationRequested)
{
break;
}
var response = await ReceiveStringAsync(currentSocket, ct);
if (string.IsNullOrEmpty(response))
{
if (currentSocket.State != WebSocketState.Open)
{
break;
}
continue;
}
int user_id = Int32.Parse(context.User.FindFirst(ClaimTypes.NameIdentifier).Value);
int comp_id = Int32.Parse(context.User.FindFirst("CompanyID").Value);
GroupChatMessage message = new GroupChatMessage
{
UserID = user_id,
CompanyID = comp_id,
Text = response,
CreationDate = DateTime.Now
};
await chatContext.GroupChatMessages.AddAsync(message);
await chatContext.SaveChangesAsync();
foreach (var socket in _sockets)
{
if (socket.Value.State != WebSocketState.Open)
{
continue;
}
await SendStringAsync(socket.Value, response, ct);
}
}
WebSocket dummy;
_sockets.TryRemove(socketId, out dummy);
await currentSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", ct);
currentSocket.Dispose();
}