我有一个应用程序,其中使用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。
当程序运行时,websocket客户端永远不会收到错误消息。但是,如果我调试程序并逐步运行它,则客户端会收到错误消息。似乎如果关闭在发送后发生得如此之快,则数据不会刷新到底层套接字。实际上,如果在Thread.sleep(1000)
之后放置await SendErrorMessage
,则客户端确实会接收到数据。
我一直在寻找在关闭之前刷新套接字缓冲区的方法,但是我没有找到任何方法(WebSocket class似乎不允许访问基础套接字)。
如何在不使用讨厌的Thread.sleep()
的情况下将错误消息传递到网络上?