예제 #1
0
        public async Task ProcessAsync(JsonRpcContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            try
            {
                var request = context.Request;

                JsonRpcMethod method;

                if (!Methods.TryGetMethod(request.Method, out method))
                {
                    context.SetResponse(JsonRpcError.METHOD_NOT_FOUND);
                    return;
                }

                for (var i = 0; i < Behaviors.Count; i++)
                {
                    await Behaviors[i].BeforeInvoke(context);
                }

                await method.HandleAsync(context);

                for (var i = 0; i < Behaviors.Count; i++)
                {
                    await Behaviors[i].AfterInvoke(context);
                }
            }
            catch (JsonRpcException ex)
            {
                // todo: log

                context.SetResponse(ex.JsonRpcCode, ex.JsonRpcMessage, data: ex.JsonRpcData);
                return;
            }
            catch (Exception ex)
            {
                // todo: log

                context.SetResponse(JsonRpcError.INTERNAL_ERROR, data: ex.ToString());
                return;
            }
        }
예제 #2
0
            public override Task HandleAsync(JsonRpcContext context)
            {
                var methods = context.Server.Methods
                              .Select(m => m.Name)
                              .ToArray();

                context.SetResponse(methods);

                return(Task.WhenAll());
            }
예제 #3
0
        public override Task AfterInvoke(JsonRpcContext context)
        {
            var validationState = context.RequestServices.GetRequiredService <ValidationState>();

            if (validationState.HasErrors)
            {
                context.SetResponse(JsonRpcError.INVALID_PARAMS, "Invalid arguments", new
                {
                    Errors = validationState.Errors.ToDictionary(e => MakeCamelSnakePath(e.Key), e => e.Text)
                });
            }

            return(base.AfterInvoke(context));
        }
예제 #4
0
        public override async Task InvokeAsync(JsonRpcContext context)
        {
            object service = null;

            if (!Method.IsStatic)
            {
                service = context.AppServices.GetRequiredService(Type);
            }

            var parameters = new object[Parameters.Count];

            if (parameters.Length > 0)
            {
                await ReadParametersAsync(context, parameters);
            }

            // invoke the method
            var result = await Method.InvokeAsync(service, parameters);

            // return the result
            context.SetResponse(result);
        }