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)时,它工作得非常好。