国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

Asp.net Core中如何使用中間件來管理websocket

2024-07-10 12:48:43
字體:
供稿:網(wǎng)友

介紹

我喜歡.NET CORE 這個東西,其實不僅僅源于它性能很高,可以跨平臺,還因為它的設(shè)計模式確實令人著迷。以前沒.NET CORE 的時候,.NET用websocket必須跑在windows server 2012上,但我一般不會這么干,都把websocket架在nodejs的服務(wù)器上。這么分出來,麻煩肯定是麻煩的,而且js這東西,寫復(fù)雜和幾年后再看都是頭疼的問題。那么,如果.NET CORE是以kestrel運(yùn)行的,那么就不再需要考慮服務(wù)器的版本運(yùn)行,任何一個地方都可以用websocket

ASP.NET Core SignalR是一個有用的庫,可以簡化Web應(yīng)用程序中實時通信的管理。但是,我寧愿使用WebSockets,因為我想要更靈活,并且與任何WebSocket客戶端兼容。

在Microsoft的文檔中,我找到了一個很好的WebSockets工作示例。它仍然是管理連接,以便能夠從一個連接向其他連接廣播消息,這是SignalR開箱即用的功能。期望這個邏輯非常復(fù)雜,我想從Startup類中刪除它。

背景

要閱讀ASP.NET Core中的WebSockets支持,可以在此處查看。如果您想了解中間件以及如何在ASP.NET Core中編寫它,請閱讀此鏈接。

代碼使用

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

現(xiàn)在,您可以創(chuàng)建一個擴(kuò)展方法和類來管理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); }}            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 苏尼特左旗| 卢氏县| 湟源县| 新绛县| 昌都县| 巴塘县| 合阳县| 霍邱县| 襄樊市| 随州市| 潼南县| 鄂托克前旗| 临沂市| 贡嘎县| 宁城县| 霞浦县| 涿州市| 云浮市| 灵宝市| 新竹市| 临潭县| 吉木乃县| 长乐市| 新沂市| 宁强县| 安远县| 襄汾县| 察隅县| 巢湖市| 绵竹市| 麟游县| 藁城市| 长葛市| 噶尔县| 城固县| 凤阳县| 攀枝花市| 尉氏县| 海门市| 绥阳县| 石渠县|