c#Websocket在关闭连接之前未发送消息

时间:2019-06-04 11:55:53

标签: c# asp.net-core 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。

当程序运行时,websocket客户端永远不会收到错误消息。但是,如果我调试程序并逐步运行它,则客户端会收到错误消息。似乎如果关闭在发送后发生得如此之快,则数据不会刷新到底层套接字。实际上,如果在Thread.sleep(1000)之后放置await SendErrorMessage,则客户端确实会接收到数据。

我一直在寻找在关闭之前刷新套接字缓冲区的方法,但是我没有找到任何方法(WebSocket class似乎不允许访问基础套接字)。

如何在不使用讨厌的Thread.sleep()的情况下将错误消息传递到网络上?

0 个答案:

没有答案