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