.net WebSocket:CloseOutputAsync vs CloseAsync

我们有一个有效的ASP.NET Web API REST服务,它使用HttpContext.AcceptWebSocketResponse(..)在我们的控制器方法之一上使用WebSockets。

代码看起来像这样的套接字处理程序……

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节中定义的关闭握手。

http://www.salmanq.com/blog/5-things-you-probably-didnt-know-about-net-websockets/2013/04/

…优雅的方式是CloseAsync,它在启动时向连接方发送消息,并等待确认。 …另一种选择是使用CloseOutputAsync这更像是一种“即兴发射”的方法。 …

看起来你收到了结束信息;

 if (result.MessageType == WebSocketMessageType.Close || currentSocketState == WebSocketState.CloseReceived) 

所以我说你使用CloseOutputAsync会很好,因为你已经收到一条消息“我想关闭这个连接”。