private async Task OpenWebSocketAsync() { _closeTaskCompletionSource = new TaskCompletionSource<object>(); try { var webSocketUrl = (await GetApiInfoAsync()).WebSocketServerUrl + "/client"; _webSocket = new MessageWebSocket(); _webSocket.Control.MessageType = SocketMessageType.Utf8; _webSocket.MessageReceived += (s, e) => Task.Run(() => HandleMessage(e)); _webSocket.Closed += (s, e) => Task.Run(() => HandleConnectionClose()); await _webSocket.ConnectAsync(new Uri(webSocketUrl)); _socketWriter = new DataWriter(_webSocket.OutputStream); await AuthenticateAsync(); SetChannelState(ChannelState.Connected); } catch { try { if (_webSocket != null) { _webSocket.Close(1000, "Abnormal Closure"); } } catch { } finally { if (_webSocket != null) { _webSocket.Dispose(); _webSocket = null; } SetChannelState(ChannelState.Disconnected); } throw; } }
private async Task ConnectAsync() { if (String.IsNullOrEmpty(InputField.Text)) { rootPage.NotifyUser("Please specify text to send", NotifyType.ErrorMessage); return; } // Validating the URI is required since it was received from an untrusted source (user input). // The URI is validated by calling TryGetUri() that will return 'false' for strings that are not // valid WebSocket URIs. // Note that when enabling the text box users may provide URIs to machines on the intrAnet // or intErnet. In these cases the app requires the "Home or Work Networking" or // "Internet (Client)" capability respectively. Uri server = rootPage.TryGetUri(ServerAddressField.Text); if (server == null) { return; } messageWebSocket = new MessageWebSocket(); messageWebSocket.Control.MessageType = SocketMessageType.Utf8; messageWebSocket.MessageReceived += MessageReceived; messageWebSocket.Closed += OnClosed; // If we are connecting to wss:// endpoint, by default, the OS performs validation of // the server certificate based on well-known trusted CAs. We can perform additional custom // validation if needed. if (SecureWebSocketCheckBox.IsChecked == true) { // WARNING: Only test applications should ignore SSL errors. // In real applications, ignoring server certificate errors can lead to Man-In-The-Middle // attacks. (Although the connection is secure, the server is not authenticated.) // Note that not all certificate validation errors can be ignored. // In this case, we are ignoring these errors since the certificate assigned to the localhost // URI is self-signed and has subject name = fabrikam.com messageWebSocket.Control.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted); messageWebSocket.Control.IgnorableServerCertificateErrors.Add(ChainValidationResult.InvalidName); // Add event handler to listen to the ServerCustomValidationRequested event. This enables performing // custom validation of the server certificate. The event handler must implement the desired // custom certificate validation logic. messageWebSocket.ServerCustomValidationRequested += OnServerCustomValidationRequested; // Certificate validation occurs only for secure connections. if (server.Scheme != "wss") { AppendOutputLine("Note: Certificate validation is performed only for the wss: scheme."); } } AppendOutputLine($"Connecting to {server}..."); try { await messageWebSocket.ConnectAsync(server); } catch (Exception ex) // For debugging { // Error happened during connect operation. messageWebSocket.Dispose(); messageWebSocket = null; AppendOutputLine(MainPage.BuildWebSocketError(ex)); AppendOutputLine(ex.Message); return; } // The default DataWriter encoding is Utf8. messageWriter = new DataWriter(messageWebSocket.OutputStream); rootPage.NotifyUser("Connected", NotifyType.StatusMessage); }
private async Task ConnectAsync() { if (String.IsNullOrEmpty(InputField.Text)) { rootPage.NotifyUser("Please specify text to send", NotifyType.ErrorMessage); return; } // Validating the URI is required since it was received from an untrusted source (user input). // The URI is validated by calling TryGetUri() that will return 'false' for strings that are not // valid WebSocket URIs. // Note that when enabling the text box users may provide URIs to machines on the intrAnet // or intErnet. In these cases the app requires the "Home or Work Networking" or // "Internet (Client)" capability respectively. Uri server = rootPage.TryGetUri(ServerAddressField.Text); if (server == null) { return; } messageWebSocket = new MessageWebSocket(); messageWebSocket.Control.MessageType = SocketMessageType.Utf8; messageWebSocket.MessageReceived += MessageReceived; messageWebSocket.Closed += OnClosed; AppendOutputLine($"Connecting to {server}..."); try { await messageWebSocket.ConnectAsync(server); } catch (Exception ex) // For debugging { // Error happened during connect operation. messageWebSocket.Dispose(); messageWebSocket = null; AppendOutputLine(MainPage.BuildWebSocketError(ex)); AppendOutputLine(ex.Message); return; } // The default DataWriter encoding is Utf8. messageWriter = new DataWriter(messageWebSocket.OutputStream); rootPage.NotifyUser("Connected", NotifyType.StatusMessage); }