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); }
public RpcException GetRpcErrorException(RpcErrorResponse response) { return(new RpcErrorException(response)); }
public RpcErrorException(RpcErrorResponse response) : base(response.Error.Message) { Code = response.Error.Code; }