示例#1
0
        private async Task ProcessBulkRequest(HttpContext context, RpcRequestPackage requestPackage, string s)
        {
            var path = context.Request.Path.Value.Substring(_route.Length).TrimEnd('/');

            var returnList = new List <ResponseMessage>();

            foreach (var request in requestPackage.Requests)
            {
                returnList.Add(await ProcessIndividualRequest(context, context.RequestServices, path, request));
            }

            try
            {
                SerializeToResponseBody(context, requestPackage.Serializer, returnList, _configuration.Value.SupportResponseCompression);
            }
            catch (Exception exp)
            {
                _logger?.LogError(EventIdCode.DeserializeException, exp, "Exception thrown while serializing bulk output: " + exp.Message);

                WriteErrorMessage(context, requestPackage.Serializer,
                                  new ErrorResponseMessage(JsonRpcErrorCode.InternalServerError, "Internal Server Error"));
            }
        }
示例#2
0
        public Task ProcessRequest(HttpContext context)
        {
            RpcRequestPackage requestPackage = null;

            if (_debugLogging)
            {
                _logger?.LogInformation(new EventId(10), $"Processing json-rpc request for path {context.Request.Path}");
            }

            context.Response.StatusCode = StatusCodes.Status200OK;

            var    path = context.Request.Path.Value.Substring(_route.Length).TrimEnd('/');
            Stream body = context.Request.Body;

            try
            {
                if (_configuration.Value.SupportRequestCompression &&
                    context.Request.Headers.TryGetValue("Content-Encoding", out var encoding))
                {
                    var encoder = _contentEncodingProvider.GetContentEncoder(encoding.ToString());

                    if (encoder == null)
                    {
                        // write error
                    }
                    else
                    {
                        body = encoder.DecodeStream(body);
                    }
                }

                requestPackage = DeserializeStream(context, body, path);
            }
            catch (Exception exp)
            {
                return(ProcessRequestSerizliationErrorHandler(context, _defaultSerializer, exp));
            }
            finally
            {
                if (body != context.Request.Body)
                {
                    body.Dispose();
                }
            }

            if (requestPackage != null)
            {
                if (requestPackage.IsBulk)
                {
                    return(ProcessBulkRequest(context, requestPackage, path));
                }

                var message = requestPackage.Requests.First();

                if (message.Parameters != null)
                {
                    return(ProcessRequest(context, requestPackage.Serializer, requestPackage.Requests.First(), path));
                }

                WriteErrorMessage(context, _defaultSerializer,
                                  new ErrorResponseMessage(JsonRpcErrorCode.MethodNotFound,
                                                           "Count not find method " + message.Method));

                return(Task.CompletedTask);
            }

            WriteErrorMessage(context, _defaultSerializer,
                              new ErrorResponseMessage(JsonRpcErrorCode.InvalidRequest, "Could not parse request"));

            return(Task.CompletedTask);
        }