Example #1
0
        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);
        }
Example #2
0
        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));
        }
Example #3
0
        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);
        }