/// <inheritdoc/>
        public override async Task <TResponse> ClientStreamingServerHandler <TRequest, TResponse>(
            IAsyncStreamReader <TRequest> requestStream,
            ServerCallContext context,
            ClientStreamingServerMethod <TRequest, TResponse> continuation)
        {
            using var rpcScope = new ServerRpcScope <TRequest, TResponse>(context, this.options);

            try
            {
                var requestStreamReaderProxy = new AsyncStreamReaderProxy <TRequest>(
                    requestStream,
                    rpcScope.RecordRequest);

                var response = await continuation(requestStreamReaderProxy, context).ConfigureAwait(false);

                rpcScope.RecordResponse(response);
                rpcScope.Complete();
                return(response);
            }
            catch (Exception e)
            {
                rpcScope.CompleteWithException(e);
                throw;
            }
        }
        /// <inheritdoc/>
        public override AsyncDuplexStreamingCall <TRequest, TResponse> AsyncDuplexStreamingCall <TRequest, TResponse>(
            ClientInterceptorContext <TRequest, TResponse> context,
            AsyncDuplexStreamingCallContinuation <TRequest, TResponse> continuation)
        {
            ClientRpcScope <TRequest, TResponse> rpcScope = null;

            try
            {
                rpcScope = new ClientRpcScope <TRequest, TResponse>(context, this.options);
                var responseContinuation = continuation(rpcScope.Context);

                var requestStreamProxy = new ClientStreamWriterProxy <TRequest>(
                    responseContinuation.RequestStream,
                    rpcScope.RecordRequest,
                    onException: rpcScope.CompleteWithException);

                var responseStreamProxy = new AsyncStreamReaderProxy <TResponse>(
                    responseContinuation.ResponseStream,
                    rpcScope.RecordResponse,
                    rpcScope.Complete,
                    rpcScope.CompleteWithException);

                return(new AsyncDuplexStreamingCall <TRequest, TResponse>(
                           requestStreamProxy,
                           responseStreamProxy,
                           responseContinuation.ResponseHeadersAsync,
                           responseContinuation.GetStatus,
                           responseContinuation.GetTrailers,
                           responseContinuation.WithBestEffortDispose(rpcScope)));
            }
            catch (Exception e)
            {
                rpcScope?.CompleteWithException(e);
                throw;
            }
            finally
            {
                rpcScope?.RestoreParentActivity();
            }
        }