Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#Websocket在关闭连接之前不发送消息_C#_Asp.net Core_Websocket - Fatal编程技术网

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

c#Websocket在关闭连接之前不发送消息,c#,asp.net-core,websocket,C#,Asp.net Core,Websocket,我有一个应用程序,其中我使用System.Net.Websockets.WebSocket类通过WebSocket发送信息。除了一个令人讨厌的细节外,一切都很顺利。当发生错误时,我希望服务器通过websocket发送错误消息,然后关闭连接。它的工作原理如下: private async Task CloseOnError(ErrorMessage error, WebSocket socket) { await SendErrorMessage(error

我有一个应用程序,其中我使用
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(错误消息错误,WebSocket套接字)
{
等待SendErrorMessage(错误,套接字);
wait socket.CloseAsync(WebSocketCloseStatus.InvalidMessageType,“ClosedOnError”,CancellationToken.None);
返回;
}
专用异步任务SendErrorMessage(ErrorMessage错误,WebSocket套接字)
{
等待SendMessageAsync(套接字,JsonConvert.SerializeObject(错误));
返回;
}
专用异步任务SendMessageAsync(WebSocket套接字,字符串消息)
{
if(socket==null | | socket.State!=WebSocketState.Open)
{
返回;
}
等待socket.SendAsync(
缓冲区:新的ArraySegment(
数组:Encoding.ASCII.GetBytes(消息),
偏移量:0,
计数:message.Length),
messageType:WebSocketMessageType.Text,
endOfMessage:对,
cancellationToken:cancellationToken.None);
}
我调用
CloseOnError
传递一个自定义
ErrorMessage
对象和我正在使用的
WebSocket
实例
SendErrorMessage
通过websocket将错误序列化为json,然后我使用
socket.CloseAsync
关闭websocket

当程序运行时,websocket客户端从未收到错误消息。但是,如果我调试程序并一步一步地运行它,客户端就会收到错误消息。如果在发送之后关闭的速度太快,数据就不会刷新到底层套接字。事实上,如果在
等待发送错误消息之后放置
线程.sleep(1000)
,则客户端确实会收到数据

我在关闭前搜索了刷新套接字缓冲区的方法,但没有找到任何方法(似乎不允许访问底层套接字)


我如何才能在不使用讨厌的
线程的情况下将错误消息发送到有线电视上。sleep()

在我看来像是一种竞争条件。您可以检查WebSocketCloseStatus()并在必要时打开一个新的?但即使这样也不是防弹的(它可能在检查和发送调用之间接近。最后我意识到问题不在服务器端,而是在客户端。尝试使用另一个websocket客户端(wscat)时,它工作得非常好。