public RpcResponseBase InvokeRequest(RpcRequest request, RpcRoute route)
        {
            try
            {
                if (request == null)
                {
                    throw new ArgumentNullException(nameof(request));
                }
                if (route == null)
                {
                    throw new ArgumentNullException(nameof(route));
                }
            }
            catch (ArgumentNullException ex)             // Dont want to throw any exceptions when doing async requests
            {
                return(this.GetUnknownExceptionReponse(request, ex));
            }

            this.Logger?.LogVerbose($"Invoking request with id '{request.Id}'");
            RpcResponseBase rpcResponse;

            try
            {
                if (!string.Equals(request.JsonRpcVersion, "2.0"))
                {
                    throw new RpcInvalidRequestException("Request must be jsonrpc version '2.0'");
                }

                object[]  parameterList;
                RpcMethod rpcMethod = this.GetMatchingMethod(route, request, out parameterList);

                this.Logger?.LogVerbose($"Attempting to invoke method '{request.Method}'");
                object result = rpcMethod.Invoke(parameterList);
                this.Logger?.LogVerbose($"Finished invoking method '{request.Method}'");

                rpcResponse = new RpcResultResponse(request.Id, result);
            }
            catch (RpcException ex)
            {
                this.Logger?.LogError("An Rpc error occurred. Returning an Rpc error response", ex);
                RpcError error = new RpcError(ex);
                rpcResponse = new RpcErrorResponse(request.Id, error);
            }
            catch (Exception ex)
            {
                rpcResponse = this.GetUnknownExceptionReponse(request, ex);
            }

            if (request.Id != null)
            {
                this.Logger?.LogVerbose($"Finished request with id '{request.Id}'");
                //Only give a response if there is an id
                return(rpcResponse);
            }
            this.Logger?.LogVerbose($"Finished request with no id. Not returning a response");
            return(null);
        }
        public void InvokeRequest_AmbiguousRequest_ErrorResponse()
        {
            RpcRequest stringRequest = new RpcRequest("1", "2.0", "AmbiguousMethod", 1);
            RpcRoute   route         = new RpcRoute();

            route.AddClass <TestRouteClass>();
            IRpcInvoker     invoker  = new DefaultRpcInvoker();
            RpcResponseBase response = invoker.InvokeRequest(stringRequest, route);

            RpcErrorResponse errorResponse = Assert.IsType <RpcErrorResponse>(response);

            Assert.NotNull(errorResponse.Error);
            Assert.Equal(errorResponse.Error.Code, (int)RpcErrorCode.AmbiguousMethod);
        }
        private RpcResponseBase GetUnknownExceptionReponse(RpcRequest request, Exception ex)
        {
            this.Logger?.LogError("An unknown error occurred. Returning an Rpc error response", ex);
#if DEBUG
            string message = ex.Message;
#else
            string message = "An internal server error has occurred";
#endif
            RpcUnknownException exception = new RpcUnknownException(message);
            RpcError            error     = new RpcError(exception);
            if (request?.Id == null)
            {
                return(null);
            }
            RpcResponseBase rpcResponse = new RpcErrorResponse(request.Id, error);
            return(rpcResponse);
        }
Exemple #4
0
 public RpcException GetRpcErrorException(RpcErrorResponse response)
 {
     return(new RpcErrorException(response));
 }
 public RpcErrorException(RpcErrorResponse response)
     : base(response.Error.Message)
 {
     Code = response.Error.Code;
 }