国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

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

來源:懂視網 責編:小采 時間:2020-11-27 22:34:54
文檔

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

Asp.net Core中如何使用中間件來管理websocket:介紹 我喜歡.NET CORE 這個東西,其實不僅僅源于它性能很高,可以跨平臺,還因為它的設計模式確實令人著迷。以前沒.NET CORE 的時候,.NET用websocket必須跑在windows server 2012上,但我一般不會這么干,都把websocket架在nodejs的服務器上
推薦度:
導讀Asp.net Core中如何使用中間件來管理websocket:介紹 我喜歡.NET CORE 這個東西,其實不僅僅源于它性能很高,可以跨平臺,還因為它的設計模式確實令人著迷。以前沒.NET CORE 的時候,.NET用websocket必須跑在windows server 2012上,但我一般不會這么干,都把websocket架在nodejs的服務器上

介紹

我喜歡.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);
 }
}

在這種情況下,WebSockets請求在URL中始終包含“/ ws”。查詢字符串包含用于將WebSocket與登錄用戶相關聯的用戶名的參數u。

CustomWebSocket是一個包含WebSocket和用戶名的類:

public class CustomWebSocket
{
 public WebSocket WebSocket { get; set; }
 public string Username { get; set; }
}

我也創建了自定義WebSocket消息:

class CustomWebSocketMessage
{
 public string Text { get; set; }
 public DateTime MessagDateTime { get; set; }
 public string Username { get; set; }
 public WSMessageType Type { get; set; }
}

其中Type是您可能擁有的不同類型消息的枚舉。

在Startup類中,您必須注冊以下服務:

services.AddSingleton<ICustomWebSocketFactory, CustomWebSocketFactory>();
services.AddSingleton<ICustomWebSocketMessageHandler, CustomWebSocketMessageHandler>();

CustomWebSocketFactory負責收集連接的WebSockets列表:

public interface ICustomWebSocketFactory
{
 void Add(CustomWebSocket uws);
 void Remove(string username);
 List<CustomWebSocket> All();
 List<CustomWebSocket> Others(CustomWebSocket client);
 CustomWebSocket Client(string username);
}

public class CustomWebSocketFactory : ICustomWebSocketFactory
{
 List<CustomWebSocket> List;

 public CustomWebSocketFactory()
 {
 List = new List<CustomWebSocket>();
 }

 public void Add(CustomWebSocket uws)
 {
 List.Add(uws);
 }

 //when disconnect
 public void Remove(string username) 
 {
 List.Remove(Client(username));
 }

 public List<CustomWebSocket> All()
 {
 return List;
 }
 
 public List<CustomWebSocket> Others(CustomWebSocket client)
 {
 return List.Where(c => c.Username != client.Username).ToList();
 }
 
 public CustomWebSocket Client(string username)
 {
 return List.First(c=>c.Username == username);
 }
}

CustomWebSocketMessageHandler包含有關消息的邏輯(即在連接時需要發送任何消息以及如何對傳入消息作出反應)

public interface ICustomWebSocketMessageHandler
{
 Task SendInitialMessages(CustomWebSocket userWebSocket);
 Task HandleMessage(WebSocketReceiveResult result, byte[] buffer, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory);
 Task BroadcastOthers(byte[] buffer, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory);
 Task BroadcastAll(byte[] buffer, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory);
}

public class CustomWebSocketMessageHandler : ICustomWebSocketMessageHandler
{
 public async Task SendInitialMessages(CustomWebSocket userWebSocket)
 {
 WebSocket webSocket = userWebSocket.WebSocket;
 var msg = new CustomWebSocketMessage
 {
 MessagDateTime = DateTime.Now,
 Type = WSMessageType.anyType,
 Text = anyText,
 Username = "system"
 };

 string serialisedMessage = JsonConvert.SerializeObject(msg);
 byte[] bytes = Encoding.ASCII.GetBytes(serialisedMessage);
 await webSocket.SendAsync(new ArraySegment<byte>(bytes, 0, bytes.Length), WebSocketMessageType.Text, true, CancellationToken.None);
 }

 public async Task HandleMessage(WebSocketReceiveResult result, byte[] buffer, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory)
 {
 string msg = Encoding.ASCII.GetString(buffer);
 try
 {
 var message = JsonConvert.DeserializeObject<CustomWebSocketMessage>(msg);
 if (message.Type == WSMessageType.anyType)
 {
 await BroadcastOthers(buffer, userWebSocket, wsFactory);
 }
 }
 catch (Exception e)
 {
 await userWebSocket.WebSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
 }
 }

 public async Task BroadcastOthers(byte[] buffer, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory)
 {
 var others = wsFactory.Others(userWebSocket);
 foreach (var uws in others)
 {
 await uws.WebSocket.SendAsync(new ArraySegment<byte>(buffer, 0, buffer.Length), WebSocketMessageType.Text, true, CancellationToken.None);
 }
 }

 public async Task BroadcastAll(byte[] buffer, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory)
 {
 var all = wsFactory.All();
 foreach (var uws in all)
 {
 await uws.WebSocket.SendAsync(new ArraySegment<byte>(buffer, 0, buffer.Length), WebSocketMessageType.Text, true, CancellationToken.None);
 }
 }
}

最后,在Configure方法的Startup類中添加以下內容:

var webSocketOptions = new WebSocketOptions()
{
 KeepAliveInterval = TimeSpan.FromSeconds(120),
 ReceiveBufferSize = 4 * 1024
};

app.UseWebSockets(webSocketOptions);
app.UseCustomWebSocketManager();

通過這種方式,Starup類保持干凈,管理WebSockets的邏輯可以擴展,使您可以根據自己的喜好靈活地組織它。

總結

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

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

Asp.net Core中如何使用中間件來管理websocket:介紹 我喜歡.NET CORE 這個東西,其實不僅僅源于它性能很高,可以跨平臺,還因為它的設計模式確實令人著迷。以前沒.NET CORE 的時候,.NET用websocket必須跑在windows server 2012上,但我一般不會這么干,都把websocket架在nodejs的服務器上
推薦度:
標簽: web core 中間件
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 99久久国内精品成人免费 | 久久久成人网 | 国产成人久久久精品毛片 | 最新亚洲精品 | 日韩 亚洲 制服 欧美 综合 | 色在线网站免费观看 | 欧美在线观看日韩欧美在线观看 | 在线日韩视频 | 欧美 日韩 国产 在线 | 欧州人曾交| 99久久精品国产一区二区成人 | 久久久久免费精品国产小说 | 最新国产精品亚洲 | 老司机精品视频一区二区 | 真实的国产乱xxxx在线 | 日韩精品一二三区 | 久久久精品一区二区三区 | 亚洲精品日韩专区在线观看 | 国产免费一区二区三区免费视频 | 日韩欧美在线综合网高清 | 免费视频精品一区二区 | 亚洲精品视频在线 | 国产一级一级一级成人毛片 | 亚洲欧美日韩综合在线 | 亚洲一区二区三区四区视频 | 欧美v亚洲v国产v | 欧美日韩精品一区二区在线播放 | 国产成人一区在线播放 | 欧美 韩国 精品 另类 综合 | 欧美整片第一页 | 一区二区三区免费在线观看 | 国产精品高清在线观看 | 亚洲一区二区成人 | 日本久久香蕉一本一道 | 国产视频不卡 | 日韩精品一区二区三区不卡 | 中文字幕美日韩在线高清 | 国产va免费精品 | 久久亚洲伊人成综合人影院 | 精品久久久久久亚洲 | 自拍 欧美 日韩 |