我们有一个有效的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节中定义的结束握手。
答案 0 :(得分:8)
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
就可以了,因为你已经收到一条消息“我想关闭此连接”。