首页 > 解决方案 > 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()

标签: c#asp.net-corewebsocket

解决方案


推荐阅读