@@ -392,12 +392,19 @@ public ResponseMessage ReceiveMessage(
392
392
try
393
393
{
394
394
helper . ReceivingMessage ( ) ;
395
- using ( var buffer = ReceiveBuffer ( operationContext ) )
395
+ while ( true )
396
396
{
397
- EnsureResponseToIsCorrect ( buffer , responseTo ) ;
398
- var message = helper . DecodeMessage ( operationContext , buffer , encoderSelector ) ;
399
- helper . ReceivedMessage ( buffer , message ) ;
400
- return message ;
397
+ using ( var buffer = ReceiveBuffer ( operationContext ) )
398
+ {
399
+ if ( responseTo != GetResponseTo ( buffer ) )
400
+ {
401
+ continue ;
402
+ }
403
+
404
+ var message = helper . DecodeMessage ( operationContext , buffer , encoderSelector ) ;
405
+ helper . ReceivedMessage ( buffer , message ) ;
406
+ return message ;
407
+ }
401
408
}
402
409
}
403
410
catch ( Exception ex )
@@ -421,12 +428,19 @@ public async Task<ResponseMessage> ReceiveMessageAsync(
421
428
try
422
429
{
423
430
helper . ReceivingMessage ( ) ;
424
- using ( var buffer = await ReceiveBufferAsync ( operationContext ) . ConfigureAwait ( false ) )
431
+ while ( true )
425
432
{
426
- EnsureResponseToIsCorrect ( buffer , responseTo ) ;
427
- var message = helper . DecodeMessage ( operationContext , buffer , encoderSelector ) ;
428
- helper . ReceivedMessage ( buffer , message ) ;
429
- return message ;
433
+ using ( var buffer = await ReceiveBufferAsync ( operationContext ) . ConfigureAwait ( false ) )
434
+ {
435
+ if ( responseTo != GetResponseTo ( buffer ) )
436
+ {
437
+ continue ;
438
+ }
439
+
440
+ var message = helper . DecodeMessage ( operationContext , buffer , encoderSelector ) ;
441
+ helper . ReceivedMessage ( buffer , message ) ;
442
+ return message ;
443
+ }
430
444
}
431
445
}
432
446
catch ( Exception ex )
@@ -437,21 +451,10 @@ public async Task<ResponseMessage> ReceiveMessageAsync(
437
451
}
438
452
}
439
453
440
- private IByteBuffer EnsureResponseToIsCorrect ( IByteBuffer message , int responseTo )
454
+ private int GetResponseTo ( IByteBuffer message )
441
455
{
442
- var receivedResponseTo = GetResponseTo ( message ) ;
443
- if ( receivedResponseTo != responseTo )
444
- {
445
- throw new InvalidOperationException ( $ "Expected responseTo to be { responseTo } but was { receivedResponseTo } .") ; // should not be reached
446
- }
447
-
448
- return message ;
449
-
450
- int GetResponseTo ( IByteBuffer message )
451
- {
452
- var backingBytes = message . AccessBackingBytes ( 8 ) ;
453
- return BitConverter . ToInt32 ( backingBytes . Array , backingBytes . Offset ) ;
454
- }
456
+ var backingBytes = message . AccessBackingBytes ( 8 ) ;
457
+ return BitConverter . ToInt32 ( backingBytes . Array , backingBytes . Offset ) ;
455
458
}
456
459
457
460
private void SendBuffer ( OperationContext operationContext , IByteBuffer buffer )
0 commit comments