2014-11-04 9 views
6

Mamy działającą usługę REST ASP.NET Web API REST, która korzysta z WebSockets na jednej z metod naszego kontrolera za pomocą HttpContext.AcceptWebSocketResponse (..)..net WebSocket: CloseOutputAsync kontra CloseAsync

Handler gniazdo kod wygląda mniej więcej tak ...

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) 
     { 
     ... 
     } 
    } 
} 

Jaka jest różnica między .CloseAsync() i CloseOutputAysnc()? Próbowałem obu i obaj wydawali się działać dobrze, ale musi być jakaś różnica. Obaj mają bardzo podobne opisy na MSDN ...

System.Net.WebSockets.CloseAsync - Zamyka połączenie websocket jako asynchronicznej operacji przy użyciu ścisłej handshake zdefiniowany w rozdziale specyfikacji protokołu websocket 7.

System.Net.WebSockets.CloseOutputAsync - rozpoczyna lub kończy się blisko uzgadniania określonych w protokole websocket sekcji specyfikacji 7.

Odpowiedz

8

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

... Pełen wdzięku sposób to CloseAsync, który po uruchomieniu wysyła wiadomość do podłączonego urządzenia i czeka na potwierdzenie. ... Inną opcją jest użycie CloseOutputAsync, co jest bardziej podejściem "fire-and-forget". ...

Wygląda na to, że otrzymujesz wiadomość końcową;

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

więc powiedziałbym, że będziesz dobrze używając CloseOutputAsync bo już dostał wiadomość, która mówi: „Chcę, aby zamknąć to połączenie”.

Powiązane problemy