Exemple #1
0
        private async Task <IResponse> InvokeRemoteMethodAsync(IRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            var invokeResult = await _asyncCoupler.WaitOnAsync(
                async() => await _client.TransmitAsync(request),
                request.CorrelationId,
                _requestTimeout);

            if (invokeResult == null)
            {
                throw new NullReferenceException(nameof(invokeResult));
            }

            // timeout is the only likely failure case
            if (!invokeResult.Successful)
            {
                if (invokeResult.Errors == null)
                {
                    throw new NullReferenceException($"RPC for {request.DestinationPath} failed, {nameof(invokeResult)}.{nameof(invokeResult.Errors)} is null.");
                }

                var error = invokeResult.Errors.FirstOrDefault();
                if (error != null)
                {
                    throw new RpcException($"RPC for {request.DestinationPath} failed, {error.Message}");
                }
            }

            if (invokeResult.Result == null)
            {
                throw new NullReferenceException($"RPC for {request.DestinationPath} failed, {nameof(invokeResult)}.{nameof(invokeResult.Result)} is null.");
            }

            return((IResponse)invokeResult.Result);
        }