UWP 中的 WebSocket 因未知原因崩溃
WebSocket in UWP crashes with unknown reason
我想在 UWP 下使用 WebSockets 创建与 ASP.NET 5.0 的通信。
在线有问题"var response = await socket.ReceiveAsync.."
出现以下错误:
System.Exception: Exception from HRESULT: 0x80072EFE
at Windows.Networking.Sockets.MessageWebSocketMessageReceivedEventArgs.GetDataReader()
at System.Net.WebSockets.WinRTWebSocket.OnMessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
代码:
async void Initialize(Uri serverAddress)
{
tokenSource = new CancellationTokenSource();
token = tokenSource.Token;
socket = new ClientWebSocket();
try
{
await socket.ConnectAsync(serverAddress, token);
await Task.Delay(1000);
byte[] data = new byte[1024];
var response = await socket.ReceiveAsync(new ArraySegment<byte>(data), token); // crashes with error HRESULT
await Task.Delay(1000);
if (response.EndOfMessage)
{
if (response.Count >= data.Length) // error
return;
string json = Encoding.UTF8.GetString(data, 0, response.Count);
PacketData packet = JsonConvert.DeserializeObject<PacketData>(json);
}
}
catch (Exception ex)
{
if (socket != null)
{
socket.Dispose();
socket = null;
}
}
}
我做错了什么吗?
我尝试 运行 几次。一旦我获得数据,但它在 "object obj = ..." 上崩溃了 我检查了 json 值并且它是正确的,我认为它 运行 没问题,但有些东西我看不出是什么导致了崩溃。
谢谢
编辑!
使用 MessageWebSocket
的新代码
使用以下代码时出错:"The operation attempted to access data outside the valid range"
private void MSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
{
byte[] data = new byte[1024];
try
{
int length = 0;
using (DataReader reader = args.GetDataReader())
{
reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
length = (int)reader.UnconsumedBufferLength; // If I create byte[] with length after then it throw same error like in original post.
reader.ReadBytes(data); // Exception jump
}
string json = Encoding.UTF8.GetString(data, 0, length);
PacketData packet = JsonConvert.DeserializeObject<PacketData>(json);
}
catch(Exception ex)
{
string a = ex.Message;
}
}
初始化:
mSocket = new MessageWebSocket();
mSocket.Control.MessageType = SocketMessageType.Binary;
mSocket.Control.MaxMessageSize = 1024;
mSocket.MessageReceived += MSocket_MessageReceived;
编辑 2!
找到唯一的工作方式,它创建静态大小的数组。我不知道如何动态地制作它。请帮助我!
private void MSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
{
byte[] data = new byte[27];
try
{
int length = 0;
using (DataReader reader = args.GetDataReader())
{
reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
length = (int)reader.UnconsumedBufferLength;
reader.ReadBytes(data);
}
string json = Encoding.UTF8.GetString(data, 0, length);
PacketData packet = JsonConvert.DeserializeObject<PacketData>(json);
}
catch(Exception ex)
{
string a = ex.Message;
}
}
编辑3:
添加了 Array.Resize(ref data, length),似乎有效,但我认为不正确。
DataReader
class 有一个 ReadString
方法,我们可以使用此方法来获取接收到的消息,而无需使用 byte[]
如下所示:
private void MSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
{
try
{
using (DataReader reader = args.GetDataReader())
{
reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
string json = reader.ReadString(reader.UnconsumedBufferLength);
PacketData packet = JsonConvert.DeserializeObject<PacketData>(json);
}
}
catch (Exception ex)
{
string a = ex.Message;
}
}
如果你还想使用byte[]
,你可以试试下面的代码:
private void MSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
{
byte[] data;
try
{
int length = 0;
using (DataReader reader = args.GetDataReader())
{
reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
length = (int)reader.UnconsumedBufferLength;
data = new byte[length];
reader.ReadBytes(data);
}
string json = System.Text.Encoding.UTF8.GetString(data, 0, length);
PacketData packet = JsonConvert.DeserializeObject<PacketData>(json);
}
catch (Exception ex)
{
string a = ex.Message;
}
}
我想在 UWP 下使用 WebSockets 创建与 ASP.NET 5.0 的通信。
在线有问题"var response = await socket.ReceiveAsync.." 出现以下错误:
System.Exception: Exception from HRESULT: 0x80072EFE
at Windows.Networking.Sockets.MessageWebSocketMessageReceivedEventArgs.GetDataReader()
at System.Net.WebSockets.WinRTWebSocket.OnMessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
代码:
async void Initialize(Uri serverAddress)
{
tokenSource = new CancellationTokenSource();
token = tokenSource.Token;
socket = new ClientWebSocket();
try
{
await socket.ConnectAsync(serverAddress, token);
await Task.Delay(1000);
byte[] data = new byte[1024];
var response = await socket.ReceiveAsync(new ArraySegment<byte>(data), token); // crashes with error HRESULT
await Task.Delay(1000);
if (response.EndOfMessage)
{
if (response.Count >= data.Length) // error
return;
string json = Encoding.UTF8.GetString(data, 0, response.Count);
PacketData packet = JsonConvert.DeserializeObject<PacketData>(json);
}
}
catch (Exception ex)
{
if (socket != null)
{
socket.Dispose();
socket = null;
}
}
}
我做错了什么吗? 我尝试 运行 几次。一旦我获得数据,但它在 "object obj = ..." 上崩溃了 我检查了 json 值并且它是正确的,我认为它 运行 没问题,但有些东西我看不出是什么导致了崩溃。
谢谢
编辑! 使用 MessageWebSocket
的新代码使用以下代码时出错:"The operation attempted to access data outside the valid range"
private void MSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
{
byte[] data = new byte[1024];
try
{
int length = 0;
using (DataReader reader = args.GetDataReader())
{
reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
length = (int)reader.UnconsumedBufferLength; // If I create byte[] with length after then it throw same error like in original post.
reader.ReadBytes(data); // Exception jump
}
string json = Encoding.UTF8.GetString(data, 0, length);
PacketData packet = JsonConvert.DeserializeObject<PacketData>(json);
}
catch(Exception ex)
{
string a = ex.Message;
}
}
初始化:
mSocket = new MessageWebSocket();
mSocket.Control.MessageType = SocketMessageType.Binary;
mSocket.Control.MaxMessageSize = 1024;
mSocket.MessageReceived += MSocket_MessageReceived;
编辑 2! 找到唯一的工作方式,它创建静态大小的数组。我不知道如何动态地制作它。请帮助我!
private void MSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
{
byte[] data = new byte[27];
try
{
int length = 0;
using (DataReader reader = args.GetDataReader())
{
reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
length = (int)reader.UnconsumedBufferLength;
reader.ReadBytes(data);
}
string json = Encoding.UTF8.GetString(data, 0, length);
PacketData packet = JsonConvert.DeserializeObject<PacketData>(json);
}
catch(Exception ex)
{
string a = ex.Message;
}
}
编辑3: 添加了 Array.Resize(ref data, length),似乎有效,但我认为不正确。
DataReader
class 有一个 ReadString
方法,我们可以使用此方法来获取接收到的消息,而无需使用 byte[]
如下所示:
private void MSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
{
try
{
using (DataReader reader = args.GetDataReader())
{
reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
string json = reader.ReadString(reader.UnconsumedBufferLength);
PacketData packet = JsonConvert.DeserializeObject<PacketData>(json);
}
}
catch (Exception ex)
{
string a = ex.Message;
}
}
如果你还想使用byte[]
,你可以试试下面的代码:
private void MSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
{
byte[] data;
try
{
int length = 0;
using (DataReader reader = args.GetDataReader())
{
reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
length = (int)reader.UnconsumedBufferLength;
data = new byte[length];
reader.ReadBytes(data);
}
string json = System.Text.Encoding.UTF8.GetString(data, 0, length);
PacketData packet = JsonConvert.DeserializeObject<PacketData>(json);
}
catch (Exception ex)
{
string a = ex.Message;
}
}