@@ -55,6 +55,28 @@ public static Task WriteMessageAsync(this PipeWriter pipeWriter, byte[] messageD
5555 return Task . FromException ( new RpcException ( SendingMessageExceedsLimitStatus ) ) ;
5656 }
5757
58+ // Must call StartAsync before the first pipeWriter.GetSpan() in WriteHeader
59+ var response = serverCallContext . HttpContext . Response ;
60+ if ( ! response . HasStarted )
61+ {
62+ var startAsyncTask = response . StartAsync ( ) ;
63+ if ( ! startAsyncTask . IsCompletedSuccessfully )
64+ {
65+ return pipeWriter . WriteMessageCoreAsyncAwaited ( messageData , serverCallContext , flush , startAsyncTask ) ;
66+ }
67+ }
68+
69+ return pipeWriter . WriteMessageCoreAsync ( messageData , serverCallContext , flush ) ;
70+ }
71+
72+ private static async Task WriteMessageCoreAsyncAwaited ( this PipeWriter pipeWriter , byte [ ] messageData , HttpContextServerCallContext serverCallContext , bool flush , Task startAsyncTask )
73+ {
74+ await startAsyncTask ;
75+ await pipeWriter . WriteMessageCoreAsync ( messageData , serverCallContext , flush ) ;
76+ }
77+
78+ private static Task WriteMessageCoreAsync ( this PipeWriter pipeWriter , byte [ ] messageData , HttpContextServerCallContext serverCallContext , bool flush )
79+ {
5880 WriteHeader ( pipeWriter , messageData . Length ) ;
5981 pipeWriter . Write ( messageData ) ;
6082
@@ -77,7 +99,7 @@ public static Task WriteMessageAsync(this PipeWriter pipeWriter, byte[] messageD
7799
78100 private static void WriteHeader ( PipeWriter pipeWriter , int length )
79101 {
80- Span < byte > headerData = pipeWriter . GetSpan ( HeaderSize ) ;
102+ var headerData = pipeWriter . GetSpan ( HeaderSize ) ;
81103 // Messages are currently always uncompressed
82104 headerData [ 0 ] = 0 ;
83105 EncodeMessageLength ( length , headerData . Slice ( 1 ) ) ;
0 commit comments