first commit and delete token
This commit is contained in:
77
Middleware/WebSocketMiddleware.cs
Normal file
77
Middleware/WebSocketMiddleware.cs
Normal file
@ -0,0 +1,77 @@
|
||||
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>();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user