我们有一个ASP.NET Web API REST服务正在工作中,其中一个控制器方法使用HttpContext.AcceptWebSocketResponse(..)来使用WebSockets。
代码中的socket handler看起来类似于这样...
代码中的socket handler看起来类似于这样...
public async Task SocketHandler(AspNetWebSocketContext context)
{
_webSocket = context.WebSocket;
...
while(!cts.IsCancellationRequested)
{
WebSocketReceiveResult result = _webSocket.ReceiveAsync(inputSegment, cts.Token).Result;
WebSocketState currentSocketState = _webSocket.State;
if (result.MessageType == WebSocketMessageType.Close ||
currentSocketState == WebSocketState.CloseReceived)
{
// Should I use .CloseAysnc() or .CloseOutputAsync()?
_webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "client requested", cts.Token).Wait();
}
if (currentSocketState == WebSocketState.Open)
{
...
}
}
}
.CloseAsync()和CloseOutputAysnc()有什么区别?我尝试了两种方法,它们似乎都可以正常工作,但一定有一些区别。在MSDN上它们的描述非常相似...
System.Net.WebSockets.CloseAsync -- 使用WebSocket协议规范第7节定义的关闭握手,以异步操作的方式关闭WebSocket连接。
System.Net.WebSockets.CloseOutputAsync -- 启动或完成WebSocket协议规范第7节中定义的关闭握手。