.net WebSocket:CloseOutputAsync vs CloseAsync

Ton*_*ony 8 .net c# websocket asp.net-web-api

我们有一个有效的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)
        {
        ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

.CloseAsync()和CloseOutputAysnc()之间有什么区别?我试过两个,他们似乎都很好,但必须有一些区别.它们在MSDN上都有非常相似的描述......

System.Net.WebSockets.CloseAsync - 使用WebSocket协议规范第7节中定义的关闭握手将WebSocket连接关闭为异步操作.

System.Net.WebSockets.CloseOutputAsync - 启动或完成WebSocket协议规范第7节中定义的关闭握手.

Toa*_*ows 9

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)
Run Code Online (Sandbox Code Playgroud)

所以我会说你用得很好,CloseOutputAsync因为你已经收到一条消息"我想要关闭这个连接".