@@ -298,7 +298,7 @@ internal async Task ProcessMessage(Message receivedMessage, CancellationToken ca
298
298
299
299
try
300
300
{
301
- transportMessage = ExtractTransportMessage ( receivedMessage , messageId ) ;
301
+ transportMessage = ExtractTransportMessage ( receivedMessage , nativeMessageId ) ;
302
302
messageId = transportMessage . Headers [ Headers . MessageId ] ;
303
303
( messageBody , messageBodyBuffer ) = await transportMessage . RetrieveBody ( messageId , s3Settings , arrayPool , cancellationToken ) . ConfigureAwait ( false ) ;
304
304
}
@@ -354,42 +354,34 @@ public static TransportMessage ExtractTransportMessage(Message receivedMessage,
354
354
TransportMessage transportMessage ;
355
355
if ( receivedMessage . MessageAttributes . TryGetValue ( TransportHeaders . Headers , out var headersAttribute ) )
356
356
{
357
+ var headers = JsonSerializer . Deserialize < Dictionary < string , string > > ( headersAttribute . StringValue ) ?? [ ] ;
357
358
transportMessage = new TransportMessage
358
359
{
359
- Headers = JsonSerializer . Deserialize < Dictionary < string , string > > ( headersAttribute . StringValue ) ?? [ ] ,
360
+ Headers = headers ,
360
361
Body = receivedMessage . Body
361
362
} ;
362
- if ( receivedMessage . MessageAttributes . TryGetValue ( TransportHeaders . S3BodyKey , out var s3BodyKey ) )
363
- {
364
- transportMessage . Headers [ TransportHeaders . S3BodyKey ] = s3BodyKey . StringValue ;
365
- transportMessage . S3BodyKey = s3BodyKey . StringValue ;
366
- }
363
+ transportMessage . CopyMessageAttributes ( receivedMessage . MessageAttributes ) ;
364
+
365
+ // It is possible that the transport message already had a message ID and that one
366
+ // takes precedence
367
+ transportMessage . Headers . TryAdd ( Headers . MessageId , messageIdOverride ) ;
368
+ transportMessage . S3BodyKey = transportMessage . Headers . GetValueOrDefault ( TransportHeaders . S3BodyKey ) ;
367
369
}
368
370
else
369
371
{
370
372
// When the MessageTypeFullName attribute is available, we're assuming native integration
371
373
if ( receivedMessage . MessageAttributes . TryGetValue ( TransportHeaders . MessageTypeFullName , out var enclosedMessageType ) )
372
374
{
373
- var headers = new Dictionary < string , string >
374
- {
375
- { Headers . MessageId , messageIdOverride } ,
376
- { Headers . EnclosedMessageTypes , enclosedMessageType . StringValue } ,
377
- {
378
- TransportHeaders . MessageTypeFullName , enclosedMessageType . StringValue
379
- } // we're copying over the value of the native message attribute into the headers, converting this into a nsb message
380
- } ;
381
-
382
- if ( receivedMessage . MessageAttributes . TryGetValue ( TransportHeaders . S3BodyKey , out var s3BodyKey ) )
383
- {
384
- headers . Add ( TransportHeaders . S3BodyKey , s3BodyKey . StringValue ) ;
385
- }
386
-
387
375
transportMessage = new TransportMessage
388
376
{
389
- Headers = headers ,
390
- S3BodyKey = s3BodyKey ? . StringValue ,
377
+ Headers = [ ] ,
391
378
Body = receivedMessage . Body
392
379
} ;
380
+ transportMessage . CopyMessageAttributes ( receivedMessage . MessageAttributes ) ;
381
+
382
+ transportMessage . Headers [ Headers . MessageId ] = messageIdOverride ;
383
+ transportMessage . Headers [ Headers . EnclosedMessageTypes ] = enclosedMessageType . StringValue ;
384
+ transportMessage . S3BodyKey = transportMessage . Headers . GetValueOrDefault ( TransportHeaders . S3BodyKey ) ;
393
385
}
394
386
else
395
387
{
@@ -405,12 +397,17 @@ public static TransportMessage ExtractTransportMessage(Message receivedMessage,
405
397
transportMessage = new TransportMessage
406
398
{
407
399
Body = receivedMessage . Body ,
408
- Headers = new Dictionary < string , string >
409
- {
410
- // HINT: Message Id is a required field for InnerProcessMessage
411
- [ Headers . MessageId ] = receivedMessage . MessageId ,
412
- }
400
+ Headers = [ ]
413
401
} ;
402
+ transportMessage . CopyMessageAttributes ( receivedMessage . MessageAttributes ) ;
403
+ // For native integration scenarios the native message id should be used
404
+ transportMessage . Headers [ Headers . MessageId ] = receivedMessage . MessageId ;
405
+ }
406
+ else
407
+ {
408
+ // It is possible that the transport message already had a message ID and that one
409
+ // takes precedence
410
+ transportMessage . Headers . TryAdd ( Headers . MessageId , messageIdOverride ) ;
414
411
}
415
412
}
416
413
catch ( Exception ex )
@@ -422,36 +419,18 @@ public static TransportMessage ExtractTransportMessage(Message receivedMessage,
422
419
transportMessage = new TransportMessage
423
420
{
424
421
Body = receivedMessage . Body ,
425
- Headers = new Dictionary < string , string >
426
- {
427
- // HINT: Message Id is a required field for InnerProcessMessage
428
- [ Headers . MessageId ] = receivedMessage . MessageId ,
429
- }
422
+ Headers = [ ]
430
423
} ;
424
+ transportMessage . CopyMessageAttributes ( receivedMessage . MessageAttributes ) ;
425
+ // For native integration scenarios the native message id should be used
426
+ transportMessage . Headers [ Headers . MessageId ] = receivedMessage . MessageId ;
431
427
}
432
428
}
433
429
}
434
- // HINT: Message Id is the only required header
435
- transportMessage . Headers . TryAdd ( Headers . MessageId , messageIdOverride ) ;
436
- AddCustomNativeHeadersToNServiceBusHeaders ( receivedMessage , transportMessage ) ;
437
430
438
431
return transportMessage ;
439
432
}
440
433
441
- static void AddCustomNativeHeadersToNServiceBusHeaders ( Message receivedMessage , TransportMessage transportMessage )
442
- {
443
- foreach ( var receivedMessageMessageAttribute in receivedMessage . MessageAttributes )
444
- {
445
- // The code doesn't allow overriding the message ID at this point because
446
- // message id has its own complex set of rules handled earlier in the process
447
- if ( TransportHeaders . NativeMessageAttributesNotCopiedToNServiceBusHeaders . Contains ( receivedMessageMessageAttribute . Key ) || receivedMessageMessageAttribute . Key == Headers . MessageId )
448
- {
449
- continue ;
450
- }
451
- transportMessage . Headers [ receivedMessageMessageAttribute . Key ] = receivedMessageMessageAttribute . Value ? . StringValue ?? string . Empty ;
452
- }
453
- }
454
-
455
434
static bool CouldBeNativeMessage ( TransportMessage msg )
456
435
{
457
436
if ( msg . Headers == null )
0 commit comments