以下是一个使用Asp.Net Core的WebSocket的简单示例:
首先,在Startup.cs文件中,添加以下代码以启用WebSocket:
public void ConfigureServices(IServiceCollection services)
{
services.AddWebSocketManager();
// 添加其他服务配置
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseWebSockets();
app.UseWebSocketServer();
// 添加其他中间件配置
}
然后,创建一个WebSocket中间件WebSocketServerMiddleware.cs:
public class WebSocketServerMiddleware
{
private readonly RequestDelegate _next;
private readonly IWebSocketManager _webSocketManager;
public WebSocketServerMiddleware(RequestDelegate next, IWebSocketManager webSocketManager)
{
_next = next;
_webSocketManager = webSocketManager;
}
public async Task Invoke(HttpContext context)
{
if (context.WebSockets.IsWebSocketRequest)
{
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
// 处理WebSocket连接
var socketId = _webSocketManager.AddSocket(webSocket);
await _webSocketManager.HandleConnectionAsync(socketId);
await Receive(webSocket, async (result, buffer) =>
{
if (result.MessageType == WebSocketMessageType.Text)
{
await _webSocketManager.HandleMessageAsync(socketId, result, buffer);
return;
}
if (result.MessageType == WebSocketMessageType.Close)
{
await _webSocketManager.HandleDisconnectedAsync(socketId);
return;
}
});
}
else
{
await _next(context);
}
}
private async Task Receive(WebSocket webSocket, Action handleMessage)
{
var buffer = new byte[1024 * 4];
while (webSocket.State == WebSocketState.Open)
{
var result = await webSocket.ReceiveAsync(buffer, CancellationToken.None);
handleMessage(result, buffer);
}
}
}
接下来,创建一个WebSocket管理器WebSocketManager.cs:
public interface IWebSocketManager
{
string AddSocket(WebSocket socket);
Task HandleConnectionAsync(string socketId);
Task HandleMessageAsync(string socketId, WebSocketReceiveResult result, byte[] buffer);
Task HandleDisconnectedAsync(string socketId);
}
public class WebSocketManager : IWebSocketManager
{
private ConcurrentDictionary _sockets = new ConcurrentDictionary();
public string AddSocket(WebSocket socket)
{
var socketId = Guid.NewGuid().ToString();
_sockets.TryAdd(socketId, socket);
return socketId;
}
public async Task HandleConnectionAsync(string socketId)
{
// 处理新的WebSocket连接
// 可以向客户端发送初始消息
await SendMessageAsync(socketId, "Connected");
}
public async Task HandleMessageAsync(string socketId, WebSocketReceiveResult result, byte[] buffer)
{
// 处理接收到的消息
var message = Encoding.UTF8.GetString(buffer, 0, result.Count);
await SendMessageAsync(socketId, $"Received: {message}");
}
public async Task HandleDisconnectedAsync(string socketId)
{
// 处理WebSocket断开连接
_sockets.TryRemove(socketId, out var socket);
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closed by the server", CancellationToken.None);
}
private async Task SendMessageAsync(string socketId, string message)
{
if (_sockets.TryGetValue(socketId, out var socket))
{
var buffer = Encoding.UTF8.GetBytes(message);
await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
}
}
}
最后,在Startup.cs文件中添加WebSocket服务的扩展方法:
public static class WebSocketExtensions
{
public static IServiceCollection AddWebSocketManager(this IServiceCollection services)
{
services.AddSingleton();
return services;
}
public static IApplicationBuilder UseWebSocketServer(this IApplicationBuilder app)
{
app.UseMiddleware();
return app;
}
}
现在,你可以在控制器或其他地方注入IWebSocketManager,并使用它进行WebSocket通信。例如,在控制器中:
[ApiController]
[Route("api/[controller]")]
public class WebSocketController : ControllerBase
{
private readonly IWebSocketManager _webSocketManager;
public WebSocketController(IWebSocketManager webSocketManager)
{
_webSocketManager = webSocketManager;
}
[HttpGet]
public async Task Get()
{
// 向所有连接的客户端发送消息