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); }