/// <summary> /// Establishes a new send-side HybridConnection and returns the Stream. /// </summary> public async Task <HybridConnectionStream> CreateConnectionAsync() { TrackingContext trackingContext = CreateTrackingContext(this.Address); string traceSource = nameof(HybridConnectionClient) + "(" + trackingContext.ToString() + ")"; var timeoutHelper = new TimeoutHelper(this.OperationTimeout); RelayEventSource.Log.RelayClientConnectStart(traceSource); try { var webSocket = new ClientWebSocket(); webSocket.Options.Proxy = this.Proxy; webSocket.Options.KeepAliveInterval = HybridConnectionConstants.KeepAliveInterval; webSocket.Options.SetBuffer(this.ConnectionBufferSize, this.ConnectionBufferSize); if (this.TokenProvider != null) { RelayEventSource.Log.GetTokenStart(traceSource); string audience = this.Address.GetComponents(UriComponents.SchemeAndServer | UriComponents.Path, UriFormat.UriEscaped); var token = await this.TokenProvider.GetTokenAsync(audience, TokenProvider.DefaultTokenTimeout).ConfigureAwait(false); RelayEventSource.Log.GetTokenStop(token.ExpiresAtUtc); webSocket.Options.SetRequestHeader(RelayConstants.ServiceBusAuthorizationHeaderName, token.TokenString); } // Build the websocket uri, e.g. "wss://contoso.servicebus.windows.net:443/$hc/endpoint1?sb-hc-action=connect&sb-hc-id=E2E_TRACKING_ID" Uri webSocketUri = HybridConnectionUtility.BuildUri( this.Address.Host, this.Address.Port, this.Address.AbsolutePath, this.Address.Query, HybridConnectionConstants.Actions.Connect, trackingContext.TrackingId); using (var cancelSource = new CancellationTokenSource(timeoutHelper.RemainingTime())) { await webSocket.ConnectAsync(webSocketUri, cancelSource.Token).ConfigureAwait(false); } #if NET45 // TODO: Flow Response Headers in NETSTANDARD ClientWebSocket var trackingId = webSocket.ResponseHeaders[TrackingContext.TrackingIdName]; if (!string.IsNullOrEmpty(trackingId)) { // Update to the flown trackingId (which has _GX suffix) trackingContext = TrackingContext.Create(trackingId, trackingContext.SubsystemId); traceSource = nameof(HybridConnectionClient) + "(" + trackingContext.ToString() + ")"; } #endif return(new WebSocketStream(webSocket, trackingContext)); } catch (WebSocketException wsException) { throw RelayEventSource.Log.ThrowingException(WebSocketExceptionHelper.ConvertToRelayContract(wsException), traceSource); } finally { RelayEventSource.Log.RelayClientConnectStop(); } }
public void HybridHttpRequestStarting(TrackingContext trackingContext) { if (this.IsEnabled(EventLevel.Informational, EventKeywords.None)) { SetCurrentThreadActivityId(trackingContext); this.HybridHttpRequestStarting(trackingContext?.ToString() ?? string.Empty); } }
public void RelayListenerRendezvousRejected(TrackingContext trackingContext, HttpStatusCode statusCode, string statusDescription) { if (this.IsEnabled()) { SetCurrentThreadActivityId(trackingContext); this.RelayListenerRendezvousRejected(trackingContext.ToString(), (int)statusCode, statusDescription); } }