/// <inheritdoc/>
        public override AsyncClientStreamingCall <TRequest, TResponse> AsyncClientStreamingCall <TRequest, TResponse>(
            ClientInterceptorContext <TRequest, TResponse> context,
            AsyncClientStreamingCallContinuation <TRequest, TResponse> continuation)
        {
            ClientRpcScope <TRequest, TResponse> rpcScope = null;

            try
            {
                rpcScope = new ClientRpcScope <TRequest, TResponse>(context, this.options);
                var responseContinuation     = continuation(rpcScope.Context);
                var clientRequestStreamProxy = new ClientStreamWriterProxy <TRequest>(
                    responseContinuation.RequestStream,
                    rpcScope.RecordRequest,
                    onException: rpcScope.CompleteWithException);

                var responseAsync = responseContinuation.ResponseAsync.ContinueWith(
                    responseTask =>
                {
                    try
                    {
                        var response = responseTask.Result;
                        rpcScope.RecordResponse(response);
                        rpcScope.Complete();
                        return(response);
                    }
                    catch (AggregateException ex)
                    {
                        rpcScope.CompleteWithException(ex.InnerException);
                        throw ex.InnerException;
                    }
                });

                return(new AsyncClientStreamingCall <TRequest, TResponse>(
                           clientRequestStreamProxy,
                           responseAsync,
                           responseContinuation.ResponseHeadersAsync,
                           responseContinuation.GetStatus,
                           responseContinuation.GetTrailers,
                           responseContinuation.WithBestEffortDispose(rpcScope)));
            }
            catch (Exception e)
            {
                rpcScope?.CompleteWithException(e);
                throw;
            }
            finally
            {
                rpcScope?.RestoreParentActivity();
            }
        }
        /// <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();
            }
        }