首页 > 编程 > .NET > 正文

Asp.net Core中如何使用中间件来管理websocket

2024-07-10 12:48:43
字体:
来源:转载
供稿:网友

介绍

我喜欢.NET CORE 这个东西,其实不仅仅源于它性能很高,可以跨平台,还因为它的设计模式确实令人着迷。以前没.NET CORE 的时候,.NET用websocket必须跑在windows server 2012上,但我一般不会这么干,都把websocket架在nodejs的服务器上。这么分出来,麻烦肯定是麻烦的,而且js这东西,写复杂和几年后再看都是头疼的问题。那么,如果.NET CORE是以kestrel运行的,那么就不再需要考虑服务器的版本运行,任何一个地方都可以用websocket

ASP.NET Core SignalR是一个有用的库,可以简化Web应用程序中实时通信的管理。但是,我宁愿使用WebSockets,因为我想要更灵活,并且与任何WebSocket客户端兼容。

在Microsoft的文档中,我找到了一个很好的WebSockets工作示例。它仍然是管理连接,以便能够从一个连接向其他连接广播消息,这是SignalR开箱即用的功能。期望这个逻辑非常复杂,我想从Startup类中删除它。

背景

要阅读ASP.NET Core中的WebSockets支持,可以在此处查看。如果您想了解中间件以及如何在ASP.NET Core中编写它,请阅读此链接。

代码使用

首先,你必须添加 Microsoft.AspNetCore.WebSockets 包到你的项目。

现在,您可以创建一个扩展方法和类来管理WebSockets:

public static class WebSocketExtensions{ public static IApplicationBuilder UseCustomWebSocketManager(this IApplicationBuilder app) {  return app.UseMiddleware<CustomWebSocketManager>(); }}public class CustomWebSocketManager{ private readonly RequestDelegate _next; public CustomWebSocketManager(RequestDelegate next) {  _next = next; } public async Task Invoke(HttpContext context, ICustomWebSocketFactory wsFactory, ICustomWebSocketMessageHandler wsmHandler) {  if (context.Request.Path == "/ws")  {   if (context.WebSockets.IsWebSocketRequest)   {    string username = context.Request.Query["u"];    if (!string.IsNullOrEmpty(username))    {     WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();     CustomWebSocket userWebSocket = new CustomWebSocket()     {      WebSocket = webSocket,      Username = username     };     wsFactory.Add(userWebSocket);     await wsmHandler.SendInitialMessages(userWebSocket);     await Listen(context, userWebSocket, wsFactory, wsmHandler);    }   }   else   {     context.Response.StatusCode = 400;   }  }  await _next(context); } private async Task Listen(HttpContext context, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory, ICustomWebSocketMessageHandler wsmHandler) {  WebSocket webSocket = userWebSocket.WebSocket;  var buffer = new byte[1024 * 4];  WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);  while (!result.CloseStatus.HasValue)  {    await wsmHandler.HandleMessage(result, buffer, userWebSocket, wsFactory);    buffer = new byte[1024 * 4];    result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);  }   wsFactory.Remove(userWebSocket.Username);  await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); }}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表