3030
3131namespace Grpc . Net . Client . Internal
3232{
33- internal partial class GrpcCall < TRequest , TResponse > : IDisposable
33+ internal sealed partial class GrpcCall < TRequest , TResponse > : GrpcCall , IDisposable
3434 where TRequest : class
3535 where TResponse : class
3636 {
37- // Getting logger name from generic type is slow
38- private const string LoggerName = "Grpc.Net.Client.Internal.GrpcCall" ;
39-
4037 private readonly CancellationTokenSource _callCts ;
4138 private readonly TaskCompletionSource < Status > _callTcs ;
4239 private readonly DateTime _deadline ;
@@ -51,17 +48,15 @@ internal partial class GrpcCall<TRequest, TResponse> : IDisposable
5148 public bool Disposed { get ; private set ; }
5249 public bool ResponseFinished { get ; private set ; }
5350 public HttpResponseMessage ? HttpResponse { get ; private set ; }
54- public CallOptions Options { get ; }
5551 public Method < TRequest , TResponse > Method { get ; }
56- public GrpcChannel Channel { get ; }
57- public ILogger Logger { get ; }
5852
5953 // These are set depending on the type of gRPC call
6054 private TaskCompletionSource < TResponse > ? _responseTcs ;
6155 public HttpContentClientStreamWriter < TRequest , TResponse > ? ClientStreamWriter { get ; private set ; }
6256 public HttpContentClientStreamReader < TRequest , TResponse > ? ClientStreamReader { get ; private set ; }
6357
6458 public GrpcCall ( Method < TRequest , TResponse > method , GrpcMethodInfo grpcMethodInfo , CallOptions options , GrpcChannel channel )
59+ : base ( options , channel )
6560 {
6661 // Validate deadline before creating any objects that require cleanup
6762 ValidateDeadline ( options . Deadline ) ;
@@ -71,9 +66,6 @@ public GrpcCall(Method<TRequest, TResponse> method, GrpcMethodInfo grpcMethodInf
7166 _callTcs = new TaskCompletionSource < Status > ( ) ;
7267 Method = method ;
7368 _grpcMethodInfo = grpcMethodInfo ;
74- Options = options ;
75- Channel = channel ;
76- Logger = channel . LoggerFactory . CreateLogger ( LoggerName ) ;
7769 _deadline = options . Deadline ?? DateTime . MaxValue ;
7870
7971 Channel . RegisterActiveCall ( this ) ;
@@ -94,6 +86,9 @@ public CancellationToken CancellationToken
9486 get { return _callCts . Token ; }
9587 }
9688
89+ public override Type RequestType => typeof ( TRequest ) ;
90+ public override Type ResponseType => typeof ( TResponse ) ;
91+
9792 public void StartUnary ( TRequest request )
9893 {
9994 _responseTcs = new TaskCompletionSource < TResponse > ( TaskCreationOptions . RunContinuationsAsynchronously ) ;
@@ -386,10 +381,10 @@ private bool TryGetTrailers([NotNullWhen(true)] out Metadata? trailers)
386381
387382 private void SetMessageContent ( TRequest request , HttpRequestMessage message )
388383 {
384+ RequestGrpcEncoding = GrpcProtocolHelpers . GetRequestEncoding ( message . Headers ) ;
389385 message . Content = new PushUnaryContent < TRequest , TResponse > (
390386 request ,
391387 this ,
392- GrpcProtocolHelpers . GetRequestEncoding ( message . Headers ) ,
393388 GrpcProtocolConstants . GrpcContentTypeHeaderValue ) ;
394389 }
395390
@@ -519,12 +514,9 @@ private async Task RunCall(HttpRequestMessage request, TimeSpan? timeout)
519514 // Read entire response body immediately and read status from trailers
520515 // Trailers are only available once the response body had been read
521516 var responseStream = await HttpResponse . Content . ReadAsStreamAsync ( ) . ConfigureAwait ( false ) ;
522- var message = await responseStream . ReadMessageAsync (
523- Logger ,
524- Method . ResponseMarshaller . ContextualDeserializer ,
517+ var message = await ReadMessageAsync (
518+ responseStream ,
525519 GrpcProtocolHelpers . GetGrpcEncoding ( HttpResponse ) ,
526- Channel . ReceiveMaxMessageSize ,
527- Channel . CompressionProviders ,
528520 singleMessage : true ,
529521 _callCts . Token ) . ConfigureAwait ( false ) ;
530522 status = GrpcProtocolHelpers . GetResponseStatus ( HttpResponse ) ;
@@ -776,7 +768,8 @@ private async Task ReadCredentials(HttpRequestMessage request)
776768
777769 private void CreateWriter ( HttpRequestMessage message )
778770 {
779- ClientStreamWriter = new HttpContentClientStreamWriter < TRequest , TResponse > ( this , message ) ;
771+ RequestGrpcEncoding = GrpcProtocolHelpers . GetRequestEncoding ( message . Headers ) ;
772+ ClientStreamWriter = new HttpContentClientStreamWriter < TRequest , TResponse > ( this ) ;
780773
781774 message . Content = new PushStreamContent < TRequest , TResponse > ( ClientStreamWriter , GrpcProtocolConstants . GrpcContentTypeHeaderValue ) ;
782775 }
@@ -898,16 +891,12 @@ private void DeadlineExceeded()
898891 internal ValueTask WriteMessageAsync (
899892 Stream stream ,
900893 TRequest message ,
901- string grpcEncoding ,
902894 CallOptions callOptions )
903895 {
904896 return stream . WriteMessageAsync (
905- Logger ,
897+ this ,
906898 message ,
907899 Method . RequestMarshaller . ContextualSerializer ,
908- grpcEncoding ,
909- Channel . SendMaxMessageSize ,
910- Channel . CompressionProviders ,
911900 callOptions ) ;
912901 }
913902
@@ -918,6 +907,7 @@ internal ValueTask WriteMessageAsync(
918907 CancellationToken cancellationToken )
919908 {
920909 return responseStream . ReadMessageAsync (
910+ DeserializationContext ,
921911 Logger ,
922912 Method . ResponseMarshaller . ContextualDeserializer ,
923913 grpcEncoding ,
0 commit comments