c# - 处理“System.Net.Websocket-Exception:远程方在未完成关闭握手的情况下关闭连接。”?
问题描述
如果我不断聊天,我可以聊天。如果我离开 2-3 分钟 WebSocket 连接关闭而没有握手错误消息我得到我不知道如何处理。
任何人都可以请帮助如何处理异常。我附上了崩溃日志,这是我的代码。
单击缩略图以查看完整的错误
public async void ConnectToServerAsync()
{
await client.ConnectAsync(new Uri("ws://api.testurl.com/ws"), CancellationToken.None);
UpdateClientState();
await Task.Factory.StartNew(async () =>
{
Refresh();
while (client.State == WebSocketState.Open)
{
WebSocketReceiveResult result;
var message = new ArraySegment<byte>(new byte[4096]);
var allBytes = new List<byte>();
do
{
result = await client.ReceiveAsync(message, CancellationToken.None);
for (int i = 0; i < result.Count; i++)
{
allBytes.Add(message.Array[i]);
}
} while (!result.EndOfMessage);
try
{
Debug.WriteLine("End of Message2 :" + result.EndOfMessage);
Debug.WriteLine("All Bytes :" + allBytes.ToString());
// Optional step to convert to a string (UTF-8 encoding).
var serialisedMessae = Encoding.UTF8.GetString(allBytes.ToArray(), 0, allBytes.Count);
var msg = JsonConvert.DeserializeObject<List<ChatModel>>(serialisedMessae);
Debug.WriteLine("Message Count :" + msg.Count);
if (Chatlist.Count != msg.Count)
{
Chatlist.Clear();
foreach (var item in msg)
{
var details = new ChatModel()
{
Message = item.Message,
MessageFrom = item.MessageFrom,
MessageTo = item.MessageTo,
RoomId = item.RoomId,
_id = item._id,
TimeStamp = item.TimeStamp.ToLocalTime()
};
Chatlist.Insert(0, details);
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Invalide message format. {ex.Message}");
}
}
}, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
void UpdateClientState()
{
OnPropertyChanged(nameof(IsConnected));
sendMessageCommand.ChangeCanExecute();
Console.WriteLine($"Websocket state {client.State}");
}
}
解决方案
理想情况下,当您使用 WebSocket 完成工作时,您需要使用以下内容关闭它:
await client.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "closing websocket", CancellationToken.None);
那应该可以解决问题。或者干脆不要WebSocket
在打开后重新创建它。我在上面的帖子中看不到客户端创建代码,但我做了一些假设,无论出于何种原因,它都试图重新制作WebSocket
,但它已经有一个现有的连接,因此会引发该错误.
推荐阅读
- javascript - 使用 HTML5 画布调整图像大小
- r - 在 R 中格式化图形
- c - 为什么当将 void 传递给 int 数组时它不起作用我的编译器说“错误:无效的初始化程序”
- c++ - Storing an std::assume_aligned pointer C++ 20
- vb.net - 获取 ClickOnce 应用的发布版本号
- r - R上的ggplot2出现ggforce facet_zoom错误
- spring - 为什么 BeanFactoryPostProcessor 接口中有 post 这个词?
- python - rasa 从自定义操作中填充插槽
- printf - 将文本文件复制到 C 中的另一个文本文件时删除尾随空格
- javascript - 将按钮单击时间添加到倒计时计时器