/// <summary> /// Parses the request and dispatches it to the correct service's method. /// </summary> /// <param name="body">The raw rpc request.</param> /// <param name="cancellationToken">The cancellation token that will be past to the service handler in case it expects/accepts one.</param> /// <returns>The response that, after serialization, is returned as response.</returns> public async Task <string> HandleAsync(string body, CancellationToken cancellationToken) { if (!JsonRpcRequest.TryParse(body, out var jsonRpcRequests, out var isBatch)) { return(JsonRpcResponse.CreateErrorResponse(null, JsonRpcErrorCodes.ParseError).ToJson(DefaultSettings)); } var results = new List <string>(); foreach (var jsonRpcRequest in jsonRpcRequests) { cancellationToken.ThrowIfCancellationRequested(); results.Add(await HandleRequestAsync(jsonRpcRequest, cancellationToken)); } return(isBatch ? $"[{string.Join(",", results)}]" : results[0]); }