Files
HikarinHeartRateMonitorService/Middleware/WebSocketMiddleware.cs

78 lines
2.7 KiB
C#

using System.Net.WebSockets;
using System.Text;
using HikarinHeartRateMonitorService.Services;
using WebSocketManager = HikarinHeartRateMonitorService.Services.WebSocketManager;
namespace HikarinHeartRateMonitorService.Middleware
{
public class WebSocketMiddleware
{
private readonly RequestDelegate _next;
private readonly WebSocketManager _webSocketManager;
private readonly ILogger<WebSocketMiddleware> _logger;
public WebSocketMiddleware(RequestDelegate next, WebSocketManager webSocketManager,
ILogger<WebSocketMiddleware> logger)
{
_next = next;
_webSocketManager = webSocketManager;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
if (!context.WebSockets.IsWebSocketRequest)
{
await _next(context);
return;
}
var socket = await context.WebSockets.AcceptWebSocketAsync();
var socketId = Guid.NewGuid().ToString();
_webSocketManager.AddSocket(socketId, socket);
_logger.LogInformation($"WebSocket连接已建立: {socketId}");
await ReceiveMessages(socketId, socket);
}
private async Task ReceiveMessages(string socketId, WebSocket socket)
{
var buffer = new byte[4096];
try
{
while (socket.State == WebSocketState.Open)
{
var result = await socket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Text)
{
var message = Encoding.UTF8.GetString(buffer, 0, result.Count);
await _webSocketManager.HandleMessageAsync(socketId, message);
}
else if (result.MessageType == WebSocketMessageType.Close)
{
await _webSocketManager.RemoveSocket(socketId);
_logger.LogInformation($"WebSocket连接已关闭: {socketId}");
break;
}
}
}
catch (Exception ex)
{
_logger.LogError(ex, $"WebSocket处理时发生错误: {socketId}");
await _webSocketManager.RemoveSocket(socketId);
}
}
}
public static class WebSocketMiddlewareExtensions
{
public static IApplicationBuilder UseHeartRateWebSockets(this IApplicationBuilder builder)
{
return builder.UseMiddleware<WebSocketMiddleware>();
}
}
}