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_AsyncMethod_Valid()
        {
            RpcRequest stringRequest = new RpcRequest("1", "2.0", "AddAsync", 1, 1);
            RpcRoute   route         = new RpcRoute();

            route.AddClass <TestRouteClass>();
            IRpcInvoker invoker = new DefaultRpcInvoker();

            RpcResponseBase response = invoker.InvokeRequest(stringRequest, route);

            RpcResultResponse resultResponse = Assert.IsType <RpcResultResponse>(response);

            Assert.NotNull(resultResponse.Result);
            Assert.Equal(resultResponse.Result, 2);
        }
        public void InvokeRequest_Int64RequestParam_ConvertToInt32Param()
        {
            RpcRequest stringRequest = new RpcRequest("1", "2.0", "IntParameter", (long)1);
            RpcRoute   route         = new RpcRoute();

            route.AddClass <TestRouteClass>();
            IRpcInvoker invoker = new DefaultRpcInvoker();

            RpcResponseBase response = invoker.InvokeRequest(stringRequest, route);

            RpcResultResponse resultResponse = Assert.IsType <RpcResultResponse>(response);

            Assert.NotNull(resultResponse.Result);
            Assert.IsType <int>(resultResponse.Result);
            Assert.Equal(resultResponse.Result, 1);
        }
        public void InvokeRequest_StringParam_ParseAsGuidType()
        {
            Guid       randomGuid    = Guid.NewGuid();
            RpcRequest stringRequest = new RpcRequest("1", "2.0", "GuidTypeMethod", randomGuid.ToString());

            RpcRoute route = new RpcRoute();

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


            RpcResultResponse stringResultResponse = Assert.IsType <RpcResultResponse>(stringResponse);

            Assert.Equal(stringResultResponse.Result, randomGuid);
        }