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