private async Task <WebSocket> CreateWebSocketWithFactoryAsync(TimeoutHelper timeoutHelper) { Contract.Assert(_connectionFactory != null, "Invalid call: CreateWebSocketWithFactory."); if (TD.WebSocketCreateClientWebSocketWithFactoryIsEnabled()) { TD.WebSocketCreateClientWebSocketWithFactory(EventTraceActivity, _connectionFactory.GetType().FullName); } // Create the client WebSocket with the factory. WebSocket ws; try { //(Uri address, WebHeaderCollection headers, ICredentials credentials, WebSocketTransportSettings settings, TimeoutHelper timeoutHelper); var headers = new WebHeaderCollection(); headers[WebSocketTransportSettings.SoapContentTypeHeader] = _channelFactory.WebSocketSoapContentType; if (_channelFactory.MessageEncoderFactory is BinaryMessageEncoderFactory) { headers[WebSocketTransportSettings.BinaryEncoderTransferModeHeader] = _channelFactory.TransferMode.ToString(); } var credentials = _channelFactory.GetCredentials(); ws = await _connectionFactory.CreateWebSocketAsync(Via, headers, credentials, WebSocketSettings.Clone(), timeoutHelper); } catch (Exception e) { if (Fx.IsFatal(e)) { throw; } throw FxTrace.Exception.AsError(new InvalidOperationException(SR.Format(SR.ClientWebSocketFactory_CreateWebSocketFailed, _connectionFactory.GetType().Name), e)); } // The returned WebSocket should be valid (non-null), in an opened state and with the same SubProtocol that we requested. if (ws == null) { throw FxTrace.Exception.AsError(new InvalidOperationException(SR.Format(SR.ClientWebSocketFactory_InvalidWebSocket, _connectionFactory.GetType().Name))); } if (ws.State != WebSocketState.Open) { ws.Dispose(); throw FxTrace.Exception.AsError(new InvalidOperationException(SR.Format(SR.ClientWebSocketFactory_InvalidWebSocket, _connectionFactory.GetType().Name))); } string requested = WebSocketSettings.SubProtocol; string obtained = ws.SubProtocol; if (!(requested == null ? string.IsNullOrWhiteSpace(obtained) : requested.Equals(obtained, StringComparison.OrdinalIgnoreCase))) { ws.Dispose(); throw FxTrace.Exception.AsError(new InvalidOperationException(SR.Format(SR.ClientWebSocketFactory_InvalidSubProtocol, _connectionFactory.GetType().Name, obtained, requested))); } return(ws); }
private async Task <WebSocket> CreateWebSocketWithFactoryAsync(X509Certificate2 certificate, TimeoutHelper timeoutHelper) { Contract.Assert(_connectionFactory != null, "Invalid call: CreateWebSocketWithFactory."); if (WcfEventSource.Instance.WebSocketCreateClientWebSocketWithFactoryIsEnabled()) { WcfEventSource.Instance.WebSocketCreateClientWebSocketWithFactory(EventTraceActivity, _connectionFactory.GetType().FullName); } // Create the client WebSocket with the factory. WebSocket ws; try { if (certificate != null) { throw ExceptionHelper.PlatformNotSupported("client certificates not supported yet"); } var headers = new WebHeaderCollection(); headers[WebSocketTransportSettings.SoapContentTypeHeader] = _channelFactory.WebSocketSoapContentType; if (_channelFactory.MessageEncoderFactory is BinaryMessageEncoderFactory) { headers[WebSocketTransportSettings.BinaryEncoderTransferModeHeader] = _channelFactory.TransferMode.ToString(); } if (HttpChannelFactory <IDuplexSessionChannel> .MapIdentity(RemoteAddress, _channelFactory.AuthenticationScheme)) { headers[HttpRequestHeader.Host] = HttpTransportSecurityHelpers.GeIdentityHostHeader(RemoteAddress); } var credentials = _channelFactory.GetCredentials(); ws = await _connectionFactory.CreateWebSocketAsync(Via, headers, credentials, WebSocketSettings.Clone(), timeoutHelper); } catch (Exception e) { if (Fx.IsFatal(e)) { throw; } throw FxTrace.Exception.AsError(new InvalidOperationException(SR.Format(SR.ClientWebSocketFactory_CreateWebSocketFailed, _connectionFactory.GetType().Name), e)); } // The returned WebSocket should be valid (non-null), in an opened state and with the same SubProtocol that we requested. if (ws == null) { throw FxTrace.Exception.AsError(new InvalidOperationException(SR.Format(SR.ClientWebSocketFactory_InvalidWebSocket, _connectionFactory.GetType().Name))); } if (ws.State != WebSocketState.Open) { ws.Dispose(); throw FxTrace.Exception.AsError(new InvalidOperationException(SR.Format(SR.ClientWebSocketFactory_InvalidWebSocket, _connectionFactory.GetType().Name))); } string requested = WebSocketSettings.SubProtocol; string obtained = ws.SubProtocol; if (!(requested == null ? string.IsNullOrWhiteSpace(obtained) : requested.Equals(obtained, StringComparison.OrdinalIgnoreCase))) { ws.Dispose(); throw FxTrace.Exception.AsError(new InvalidOperationException(SR.Format(SR.ClientWebSocketFactory_InvalidSubProtocol, _connectionFactory.GetType().Name, obtained, requested))); } return(ws); }