国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 普格县| 鹿邑县| 贵港市| 平遥县| 砀山县| 江陵县| 永靖县| 陇南市| 颍上县| 镇远县| 印江| 延吉市| 务川| 威信县| 吴忠市| 大同市| 三明市| 唐山市| 尖扎县| 浏阳市| 三台县| 齐齐哈尔市| 汉沽区| 专栏| 泉州市| 宝鸡市| 扶沟县| 鄱阳县| 岳阳市| 潮安县| 兴仁县| 昌宁县| 西乌珠穆沁旗| 兰西县| 仙游县| 雷波县| 榆中县| 东阳市| 金乡县| 安西县| 囊谦县|