public async Task ProcessWebSocketRequestAsync(WebSocket webSocket, Option <EndPoint> localEndPoint, EndPoint remoteEndPoint, string correlationId) { try { var taskCompletion = new TaskCompletionSource <bool>(); string localEndpointValue = localEndPoint.Expect(() => new ArgumentNullException(nameof(localEndPoint))).ToString(); var transport = new ServerWebSocketTransport(webSocket, localEndpointValue, remoteEndPoint.ToString(), correlationId); transport.Open(); var args = new TransportAsyncCallbackArgs { Transport = transport, CompletedSynchronously = false }; this.OnTransportAccepted(args); Events.EstablishedConnection(correlationId); transport.Closed += (sender, eventArgs) => { taskCompletion.SetResult(true); }; //wait until websocket is closed await taskCompletion.Task; } catch (Exception ex) when(!ex.IsFatal()) { Events.FailedAcceptWebSocket(correlationId, ex); throw; } }
public async Task ProcessWebSocketRequestAsync(WebSocket webSocket, Option <EndPoint> localEndPoint, EndPoint remoteEndPoint, string correlationId, X509Certificate2 clientCert, IList <X509Certificate2> clientCertChain, IAuthenticator proxyAuthenticator = null) { try { var taskCompletion = new TaskCompletionSource <bool>(); string localEndpointValue = localEndPoint.Expect(() => new ArgumentNullException(nameof(localEndPoint))).ToString(); ServerWebSocketTransport transport; if ((clientCert != null) && (clientCertChain != null)) { transport = new ServerWebSocketTransport( webSocket, localEndpointValue, remoteEndPoint.ToString(), correlationId, clientCert, clientCertChain, proxyAuthenticator ?? this.authenticator, this.clientCredentialsFactory); } else { transport = new ServerWebSocketTransport( webSocket, localEndpointValue, remoteEndPoint.ToString(), correlationId); } transport.Open(); var args = new TransportAsyncCallbackArgs { Transport = transport, CompletedSynchronously = false }; this.OnTransportAccepted(args); Events.EstablishedConnection(correlationId); transport.Closed += (sender, eventArgs) => { taskCompletion.SetResult(true); }; // wait until websocket is closed await taskCompletion.Task; } catch (Exception ex) when(!ex.IsFatal()) { Events.FailedAcceptWebSocket(correlationId, ex); throw; } }