【发布时间】:2014-07-09 12:26:24
【问题描述】:
我通过 websocket 接收 JSON。至少:我是部分的。使用在线 websocket 服务,我收到完整的 JSON 响应(所有 HTML 标记都被忽略)。当我查看在控制台中收到的 JSON 时,我可以看到 HTML 标记(在调试期间使用 HTML 查看器查看它会删除 HTML),但它会突然结束(数据不完整)。
我的缓冲区有足够的空间,我正在使用 async-await 来(据说)等待整个响应进入,然后再继续。
private async Task Receive()
{
var buffer = new byte[4096 * 20];
while (_socket.State == WebSocketState.Open)
{
var response = await _socket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (response.MessageType == WebSocketMessageType.Close)
{
await
_socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Close response received",
CancellationToken.None);
}
else
{
var result = Encoding.UTF8.GetString(buffer);
var a = buffer[1000];
var b = buffer[10000];
var c = buffer[50000];
var d = buffer[81000];
Console.WriteLine(result);
var responseObject = JsonConvert.DeserializeObject<Response>(result, _requestParameters.ResponseDataType);
OnSocketReceive.Invoke(this, new SocketEventArgs {Response = responseObject });
buffer = new byte[4096 * 20];
}
}
}
注意事项:缓冲区足够大,b、c 和 d 永远不会被填满。我还应该注意,这只发生在 1-questions-newest-tag-java 请求中,155-questions-active 工作得很好。
在做了一些挖掘之后,我发现response.CloseStatus 和response.CloseStatusDescription 总是null,response.Count 总是1396(在 Word 中复制粘贴结果确实显示总是有 1396 个字符)和response.EndOfMessage 是 false。
挖掘some source code我发现DefaultReceiveBufferSize是16 * 1024(足够大),WebSocketGetDefaultKeepAliveInterval()指的是an external implementation(但调试器显示00:00:30)。
这不是超时问题,因为调试器在在线服务收到响应的同时停止。
为什么套接字还没有收到所有数据时我的方法继续执行?
【问题讨论】:
标签: c# websocket async-await