public async Task <TResponse> ReadAsync <TResponse>(BaseRequest request) where TResponse : BaseResponse { var serializedRequest = request.SerializeObject(); var wrappedRequest = new SignalRRequest { SerializedRequest = serializedRequest, TypeName = request.GetType().Name, RequestId = Guid.NewGuid() }; m_signalRConnection.Logger.LogInfo(string.Format("Sending request: {0}, ID: {1}", wrappedRequest.TypeName, wrappedRequest.RequestId)); m_signalRConnection.SendReceive(wrappedRequest); m_signalRConnection.Logger.LogInfo(string.Format("Waiting for response: {0}, ID: {1}", wrappedRequest.TypeName, wrappedRequest.RequestId)); var response = await GetResponse <TResponse>(wrappedRequest.RequestId); return(response); }
private async Task <TR> SendAndHandleExceptionsAsync <TR>(string methodName, BaseRequest request) { var tcs = new TaskCompletionSource <TR>(); var requestId = Guid.NewGuid().ToString(); CreateExceptionSubscription(requestId, tcs); CreateValidationFailedSubscription(requestId, tcs); IDisposable successSubscription = null; var isCallEnded = false; TR result = default(TR); successSubscription = _connection.On <string>(ClientEvents.RequestSuccess, id => { if (id == requestId) { successSubscription.Dispose(); if (isCallEnded) { tcs.SetResult(result); } else { isCallEnded = true; } } }); var signalRRequest = new SignalRRequest <BaseRequest> { Request = request, RequestId = requestId }; result = await _connection.InvokeAsync <TR>(methodName, signalRRequest).ConfigureAwait(false); if (isCallEnded) { return(result); } isCallEnded = true; return(await tcs.Task.ConfigureAwait(false)); }
private async Task SendAndHandleExceptionsAsync(string methodName, BaseRequest request) { var tcs = new TaskCompletionSource <bool>(); var requestId = Guid.NewGuid().ToString(); CreateExceptionSubscription(requestId, tcs); CreateValidationFailedSubscription(requestId, tcs); IDisposable successSubscription = null; successSubscription = _connection.On <string>(ClientEvents.RequestSuccess, id => { if (id == requestId) { successSubscription.Dispose(); tcs.SetResult(true); } }); var signalRRequest = new SignalRRequest <BaseRequest>() { Request = request, RequestId = requestId }; try { await _connection.InvokeAsync(methodName, signalRRequest).ConfigureAwait(false); await tcs.Task.ConfigureAwait(false); } catch (HttpRequestException e) when(e.Message.Contains(_authorizationErrorStatusCode)) { // Workaround for HttpRequestException without StatusCode // https://github.com/dotnet/corefx/issues/24253 AccessTokenExpired?.Invoke(); } }
public async Task ExecuteAsync(SignalRRequest signalRRequest) { var request = Serializer.DeserializeObject <TRequest>(signalRRequest.SerializedRequest); await ExecuteAsync(request); }