AspNetWebSocket 没有 onclose 事件?如何触发 OnClose 处理?

Rimifon 2021-02-25 10:26:21
网上的代码都是在 await 里面 使用 while 去接收数据,客户端意外掉线后,如何处理?判断 MessageType 还是会有漏网之鱼。
...全文
491 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rimifon 2021-02-26
  • 打赏
  • 举报
回复
ashx,运行在 IIS 里面的,用的 AcceptWebSocketRequest 方法,原生 WebSocket。
		public Socket(HttpContext ctx, DeleFunc func) {
			MessageBack = func;
			ctx.AcceptWebSocketRequest(ProcessChat);
		}

		private async Task ProcessChat(AspNetWebSocketContext ctx) {
			wsCtx = ctx;
			var skt = ctx.WebSocket;
			string userMsg, exitMsg = "Close";
			while(true) {
				var buffer = new ArraySegment<byte>(new byte[2048]); try {
				var result = await skt.ReceiveAsync(buffer, CancellationToken.None);
				if(result.MessageType == WebSocketMessageType.Close) break;
				userMsg = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
				} catch(WebSocketException e) { exitMsg = e.Message; break; }
				catch(Exception e) { exitMsg = "[" + e.GetType() + "]" + e.Message; break; }
				OnMessage(userMsg, 1);
			}
			OnMessage(exitMsg, 0);
		}
by_封爱 2021-02-26
  • 打赏
  • 举报
回复
我不清楚 你用的 所谓的websocket是什么组件.. 我使用轻量级的Fleck.dll

new WebSocketServer("ws://0.0.0.0:8181").start(socket=>{
 socket.OnOpen = () =>{},
 socket.OnClose = () =>{}.
 socket.OnMessage = message =>{}
});
客户端掉线断开刷新都会触发OnClose ,并且可以从你的"集合"中移除.. 这只是这个DLL..其他类似tcpserver 基本都有onclose事件....至少我看到过好几款都有..
楠小南 2021-02-25
  • 打赏
  • 举报
回复
心跳啊,客户端没心跳就是挂了,控制一个时间,时间范围内没心跳就是客户端挂了。 WebSocket 原生太麻烦了,我都是用 SignalR 多
Rimifon 2021-02-25
  • 打赏
  • 举报
回复
主要是服务端要知道哪些客户端掉线了,心跳只能知道自己掉线了吧。

62,072

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧