.net core 和 WPF 开发升讯威在线客服与营销系统:使用 WebSocket 实现访客端通信

在 asp.net core 中配置中间件

首先我们要在 Startup.cs 中,启用 WebSocket 中间件:

varwebSocketOptions =newWebSocketOptions() {    KeepAliveInterval = TimeSpan.FromSeconds(120),};app.UseWebSockets(webSocketOptions);

可配置以下设置:

KeepAliveInterval - 向客户端发送“ping”帧的频率,以确保代理保持连接处于打开状态。 默认值为 2 分钟。

ReceiveBufferSize - 用于接收数据的缓冲区的大小。 高级用户可能需要对其进行更改,以便根据数据大小调整性能。 默认值为 4 KB。

AllowedOrigins - 用于 WebSocket 请求的允许的 Origin 标头值列表。 默认情况下,允许使用所有源。

接收访客端的请求

在请求生命周期后期(例如在 Configure 方法或操作方法的后期),检查它是否是 WebSocket 请求并接受 WebSocket 请求。

app.Use(async(context, next) =>{if(context.Request.Path =="/ws")    {if(context.WebSockets.IsWebSocketRequest)        {using(WebSocket webSocket =awaitcontext.WebSockets.AcceptWebSocketAsync())            {awaitEcho(context, webSocket);            }        }else{            context.Response.StatusCode =400;        }    }else{awaitnext();    }});

在请求期间对 Task 执行 await,如下面的示例所示:

app.Use(async(context, next) =>{using(WebSocket webSocket =awaitcontext.WebSockets.AcceptWebSocketAsync())    {varsocketFinishedTcs =newTaskCompletionSource();        BackgroundSocketProcessor.AddSocket(webSocket, socketFinishedTcs);awaitsocketFinishedTcs.Task;    }});

如果从操作方法返回过快,则还可能发生 WebSocket 关闭异常。 接受操作方法中的套接字时,需要用该套接字的代码完成运行,然后再从操作方法返回。

收发访客端消息

AcceptWebSocketAsync 方法将 TCP 连接升级到 WebSocket 连接,并提供 WebSocket 对象。 使用 WebSocket 对象发送和接收消息。

之前显示的接受 WebSocket 请求的代码将 WebSocket 对象传递给 Echo 方法。 代码接收消息并立即发回相同的消息。 循环发送和接收消息,直到客户端关闭连接:

privateasyncTaskEcho(HttpContext context, WebSocket webSocket){varbuffer =newbyte[1024*4];    WebSocketReceiveResult result =awaitwebSocket.ReceiveAsync(newArraySegment(buffer), CancellationToken.None);while(!result.CloseStatus.HasValue)    {awaitwebSocket.SendAsync(newArraySegment(buffer,0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);        result =awaitwebSocket.ReceiveAsync(newArraySegment(buffer), CancellationToken.None);    }awaitwebSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);}

如果在开始循环之前接受 WebSocket 连接,中间件管道会结束。 关闭套接字后,管道展开。 即接受 WebSocket 时,请求停止在管道中推进。 循环结束且套接字关闭时,请求继续回到管道。

处理访客端连接断开

访客端由于失去连接而断开连接时,不会自动向服务器发送通知。 服务器只有在客户端发送通知时才会收到断开连接消息。

如果客户端并非总是发送消息且不希望仅由于连接进入空闲状态就设置超时,则让客户端使用一个计时器并每隔多少秒发送一条心跳消息。 在服务器上,如果某条消息在上一条消息发出后的多少秒内尚未到达,则终止连接并报告客户端已断开连接。

你可能感兴趣的:(.net core 和 WPF 开发升讯威在线客服与营销系统:使用 WebSocket 实现访客端通信)