国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - Asp.net Core中如何使用中間件來管理websocket

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

2020-06-01 14:51nopapp ASP.NET教程

這篇文章主要給大家介紹了關于Asp.net Core中如何使用中間件來管理websocket的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

介紹

我喜歡.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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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和用戶名的類:

?
1
2
3
4
5
public class CustomWebSocket
{
 public WebSocket WebSocket { get; set; }
 public string Username { get; set; }
}

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

?
1
2
3
4
5
6
7
class CustomWebSocketMessage
{
 public string Text { get; set; }
 public DateTime MessagDateTime { get; set; }
 public string Username { get; set; }
 public WSMessageType Type { get; set; }
}

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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包含有關消息的邏輯(即在連接時需要發送任何消息以及如何對傳入消息作出反應)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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類中添加以下內容:

?
1
2
3
4
5
6
7
8
var webSocketOptions = new WebSocketOptions()
{
 KeepAliveInterval = TimeSpan.FromSeconds(120),
 ReceiveBufferSize = 4 * 1024
};
 
app.UseWebSockets(webSocketOptions);
app.UseCustomWebSocketManager();

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:http://www.nopapp.com/Blog/Article/middleware-websocket-aspnetcore

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产免费拔擦拔擦8x高清在线人 | 综合精品久久久 | 久久手机免费视频 | 久久精品综合 | 一级电影在线观看 | 日韩欧美一区二区免费 | 国产一区色 | 无码日韩精品一区二区免费 | 超碰在线9| 美女毛片| 亚洲黄色片免费观看 | 亚洲视频天堂 | 激情综合网激情 | 久久久精品网站 | 成人高清网站 | 婷婷久久综合 | 午夜资源 | 成人免费在线电影 | 成人黄页在线观看 | 久久91| 精品成人在线 | 91久久精品一区 | 人人99精| 在线亚洲一区 | 午夜视频在线播放 | 免费午夜电影 | 国产精品久久久久久久久久久久冷 | 99精品视频在线观看 | 亚洲电影一区二区三区 | 欧美日韩精品免费 | 久国产精品视频 | 无码日韩精品一区二区免费 | 日韩国产精品一区二区三区 | 国产中文字幕在线看 | 久久久久久不卡 | 九九热精品在线播放 | 日韩超碰在线观看 | 欧美日韩精品综合 | 久久中文字幕一区二区三区 | 久久99精品视频在线观看 | 久久免费精品国产 |