c# - c# Websocket在关闭连接之前不发送消息
问题描述
我有一个应用程序,我使用System.Net.Websockets.WebSocket
类通过 websocket 发送信息。一切都很好,除了一个讨厌的细节。当发生错误时,我希望服务器通过 websocket 发送错误消息,然后关闭连接。它是这样工作的:
private async Task CloseOnError(ErrorMessage error, WebSocket socket)
{
await SendErrorMessage(error, socket);
await socket.CloseAsync(WebSocketCloseStatus.InvalidMessageType, "ClosedOnError", CancellationToken.None);
return;
}
private async Task SendErrorMessage(ErrorMessage error, WebSocket socket)
{
await SendMessageAsync(socket, JsonConvert.SerializeObject(error));
return;
}
private async Task SendMessageAsync(WebSocket socket, string message)
{
if (socket == null || socket.State != WebSocketState.Open)
{
return;
}
await socket.SendAsync(
buffer: new ArraySegment<byte>(
array: Encoding.ASCII.GetBytes(message),
offset: 0,
count: message.Length),
messageType: WebSocketMessageType.Text,
endOfMessage: true,
cancellationToken: CancellationToken.None);
}
我调用CloseOnError
传递一个自定义ErrorMessage
对象和WebSocket
我正在使用的实例。SendErrorMessage
通过 websocket 将错误序列化为 json,然后我使用socket.CloseAsync
.
当程序运行时,websocket 客户端永远不会收到错误消息。但是,如果我调试程序并逐步运行它,客户端会收到错误消息。似乎在发送后关闭发生得如此之快,以至于数据没有刷新到底层套接字。事实上,如果 a put a Thread.sleep(1000)
after await SendErrorMessage
,客户端确实会收到数据。
我已经搜索了在关闭之前刷新套接字缓冲区的方法,但我没有找到任何方法(WebSocket 类似乎不允许访问底层套接字)。
我怎样才能在不使用那种讨厌的情况下将错误消息发送到网络上Thread.sleep()
?
解决方案
推荐阅读
- javascript - null 不是对象(评估“I.setJSAnimations”)
- jq - jq:如何将复杂的 json 对象与数组合并
- html - 拉取文本,具有唯一的前置文本,但没有来自网页的唯一类或标签
- php - WordPress 数据库错误:[列“日期”不能为空]
- sql-server - TSQL 查询 - 基于条件的新列
- python - 创建一个 python 脚本,将 ping 的结果打印到旋转日志中
- apache-spark - Spark-谓词没有被下推
- css - 如何使用 CSS 网格创建两列网格?
- typescript - 使用不同的头部和休息类型键入数组
- java - Selenium TestNG 中的变量错误