From 6b95513bac4ff3daa2e74b27fec66a1696fbb1a7 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 15 Apr 2026 08:26:03 +0200 Subject: [PATCH] Replace Encoding.Default with Encoding.UTF8 for clarity On .NET Core / .NET 5+ Encoding.Default always returns UTF8Encoding, so this is a no-op at runtime but removes the misleading "locale- dependent ANSI" connotation carried over from .NET Framework. The UTF-8 contract is what AMQP 0-9-1, JSON (RFC 8259), and Kafka all mandate, and Wolverine already used Encoding.UTF8 in equivalent spots. Applies across HTTP, Kafka, MQTT, RabbitMQ, Azure Service Bus, and AWS SQS production code plus the corresponding tests and docs. Closes #2513 --- docs/guide/messages.md | 4 ++-- docs/guide/messaging/message-bus.md | 2 +- docs/guide/messaging/transports/sqs/interoperability.md | 4 ++-- docs/tutorials/interop.md | 2 +- src/Http/Wolverine.Http/NewtonsoftHttpSerialization.cs | 2 +- .../CoreTests/Serialization/intrinsic_serialization.cs | 4 ++-- src/Testing/SlowTests/intrinsic_serialization_end_to_end.cs | 4 ++-- .../AWS/Wolverine.AmazonSqs.Tests/Samples/Bootstrapping.cs | 4 ++-- .../Internal/AzureServiceBusQueue.cs | 4 ++-- .../Internal/AzureServiceBusSubscription.cs | 4 ++-- .../Internal/AzureServiceBusTopic.cs | 4 ++-- .../Kafka/Wolverine.Kafka/IKafkaEnvelopeMapper.cs | 2 +- .../Kafka/Wolverine.Kafka/Internals/KafkaEnvelopeMapper.cs | 6 +++--- src/Transports/Kafka/Wolverine.Kafka/KafkaTopic.cs | 2 +- src/Transports/Kafka/Wolverine.Kafka/KafkaTopicGroup.cs | 2 +- src/Transports/MQTT/Wolverine.MQTT.Tests/connectivity.cs | 2 +- .../MQTT/Wolverine.MQTT/Internals/MqttListener.cs | 2 +- .../Wolverine.RabbitMQ.Tests/sending_raw_messages.cs | 2 +- .../Internal/RabbitMqEndpoint.NServiceBus.cs | 2 +- .../Wolverine.RabbitMQ/Internal/RabbitMqEnvelopeMapper.cs | 4 ++-- 20 files changed, 31 insertions(+), 31 deletions(-) diff --git a/docs/guide/messages.md b/docs/guide/messages.md index 8314bb1f6..9de126f74 100644 --- a/docs/guide/messages.md +++ b/docs/guide/messages.md @@ -427,14 +427,14 @@ public class SerializedMessage : ISerializable public byte[] Write() { - return Encoding.Default.GetBytes(Name); + return Encoding.UTF8.GetBytes(Name); } // You'll need at least C# 11 for static methods // on interfaces! public static object Read(byte[] bytes) { - var name = Encoding.Default.GetString(bytes); + var name = Encoding.UTF8.GetString(bytes); return new SerializedMessage { Name = name }; } } diff --git a/docs/guide/messaging/message-bus.md b/docs/guide/messaging/message-bus.md index 0706cc60d..e0abf8396 100644 --- a/docs/guide/messaging/message-bus.md +++ b/docs/guide/messaging/message-bus.md @@ -515,7 +515,7 @@ IMessageBus bus = host.MessageBus(); // The raw message data, but pretend this was sourced from a database // table or some other non-Wolverine storage in your system byte[] messageData - = Encoding.Default.GetBytes("{\"Name\": \"George Karlaftis\"}"); + = Encoding.UTF8.GetBytes("{\"Name\": \"George Karlaftis\"}"); ``` snippet source | anchor diff --git a/docs/guide/messaging/transports/sqs/interoperability.md b/docs/guide/messaging/transports/sqs/interoperability.md index 7ba05474b..56b16bd31 100644 --- a/docs/guide/messaging/transports/sqs/interoperability.md +++ b/docs/guide/messaging/transports/sqs/interoperability.md @@ -65,7 +65,7 @@ public class CustomSqsMapper : ISqsEnvelopeMapper public string BuildMessageBody(Envelope envelope) { // Serialized data from the Wolverine message - return Encoding.Default.GetString(envelope.Data); + return Encoding.UTF8.GetString(envelope.Data); } // Specify header values for the SQS message from the Wolverine envelope @@ -81,7 +81,7 @@ public class CustomSqsMapper : ISqsEnvelopeMapper public void ReadEnvelopeData(Envelope envelope, string messageBody, IDictionary attributes) { - envelope.Data = Encoding.Default.GetBytes(messageBody); + envelope.Data = Encoding.UTF8.GetBytes(messageBody); if (attributes.TryGetValue("tenant-id", out var att)) { diff --git a/docs/tutorials/interop.md b/docs/tutorials/interop.md index b1bd729b3..cbb37c462 100644 --- a/docs/tutorials/interop.md +++ b/docs/tutorials/interop.md @@ -229,7 +229,7 @@ public void UseNServiceBusInterop() { if (props.Headers.TryGetValue("NServiceBus.ReplyToAddress", out var raw)) { - var queueName = (raw is byte[] b ? Encoding.Default.GetString(b) : raw.ToString())!; + var queueName = (raw is byte[] b ? Encoding.UTF8.GetString(b) : raw.ToString())!; e.ReplyUri = new Uri($"{_parent.Protocol}://queue/{queueName}"); } } diff --git a/src/Http/Wolverine.Http/NewtonsoftHttpSerialization.cs b/src/Http/Wolverine.Http/NewtonsoftHttpSerialization.cs index 0d3dacefb..a58960c39 100644 --- a/src/Http/Wolverine.Http/NewtonsoftHttpSerialization.cs +++ b/src/Http/Wolverine.Http/NewtonsoftHttpSerialization.cs @@ -40,7 +40,7 @@ public async Task WriteJsonAsync(HttpContext context, object? body) var responseStream = response.Body; - await using var textWriter = new HttpResponseStreamWriter(responseStream, Encoding.Default, _bufferSize, _bytePool, + await using var textWriter = new HttpResponseStreamWriter(responseStream, Encoding.UTF8, _bufferSize, _bytePool, ArrayPool.Shared); using var jsonWriter = new JsonTextWriter(textWriter) { diff --git a/src/Testing/CoreTests/Serialization/intrinsic_serialization.cs b/src/Testing/CoreTests/Serialization/intrinsic_serialization.cs index 9a146bac8..84e51680c 100644 --- a/src/Testing/CoreTests/Serialization/intrinsic_serialization.cs +++ b/src/Testing/CoreTests/Serialization/intrinsic_serialization.cs @@ -26,14 +26,14 @@ public class SerializedMessage : ISerializable public byte[] Write() { - return Encoding.Default.GetBytes(Name); + return Encoding.UTF8.GetBytes(Name); } // You'll need at least C# 11 for static methods // on interfaces! public static object Read(byte[] bytes) { - var name = Encoding.Default.GetString(bytes); + var name = Encoding.UTF8.GetString(bytes); return new SerializedMessage { Name = name }; } } diff --git a/src/Testing/SlowTests/intrinsic_serialization_end_to_end.cs b/src/Testing/SlowTests/intrinsic_serialization_end_to_end.cs index d040472ca..c9261b385 100644 --- a/src/Testing/SlowTests/intrinsic_serialization_end_to_end.cs +++ b/src/Testing/SlowTests/intrinsic_serialization_end_to_end.cs @@ -52,12 +52,12 @@ public class SerializedMessage : ISerializable public byte[] Write() { - return Encoding.Default.GetBytes(Name); + return Encoding.UTF8.GetBytes(Name); } public static object Read(byte[] bytes) { - var name = Encoding.Default.GetString(bytes); + var name = Encoding.UTF8.GetString(bytes); return new SerializedMessage { Name = name }; } } \ No newline at end of file diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/Samples/Bootstrapping.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/Samples/Bootstrapping.cs index 97cf00f46..3afb6b4b7 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/Samples/Bootstrapping.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/Samples/Bootstrapping.cs @@ -389,7 +389,7 @@ public class CustomSqsMapper : ISqsEnvelopeMapper public string BuildMessageBody(Envelope envelope) { // Serialized data from the Wolverine message - return Encoding.Default.GetString(envelope.Data!); + return Encoding.UTF8.GetString(envelope.Data!); } // Specify header values for the SQS message from the Wolverine envelope @@ -405,7 +405,7 @@ public IEnumerable> ToAttributes(Env public void ReadEnvelopeData(Envelope envelope, string messageBody, IDictionary attributes) { - envelope.Data = Encoding.Default.GetBytes(messageBody); + envelope.Data = Encoding.UTF8.GetBytes(messageBody); if (attributes.TryGetValue("tenant-id", out var att)) { diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusQueue.cs b/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusQueue.cs index ceb5e3213..f19235c52 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusQueue.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusQueue.cs @@ -243,7 +243,7 @@ void ReadReplyUri(Envelope e, ServiceBusReceivedMessage serviceBusReceivedMessag if (serviceBusReceivedMessage.ApplicationProperties.TryGetValue("NServiceBus.ReplyToAddress", out var raw)) { - var queueName = (raw is byte[] b ? Encoding.Default.GetString(b) : raw.ToString())!; + var queueName = (raw is byte[] b ? Encoding.UTF8.GetString(b) : raw.ToString())!; e.ReplyUri = new Uri($"{Parent.Protocol}://queue/{queueName}"); } } @@ -255,7 +255,7 @@ void ReadReplyUri(Envelope e, ServiceBusReceivedMessage serviceBusReceivedMessag // Incoming if (m.ApplicationProperties.TryGetValue("NServiceBus.EnclosedMessageTypes", out var raw)) { - var typeName = (raw is byte[] b ? Encoding.Default.GetString(b) : raw.ToString())!; + var typeName = (raw is byte[] b ? Encoding.UTF8.GetString(b) : raw.ToString())!; if (typeName.IsNotEmpty()) { var messageType = Type.GetType(typeName); diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusSubscription.cs b/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusSubscription.cs index 90b650dd4..4d3d4f4b5 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusSubscription.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusSubscription.cs @@ -254,7 +254,7 @@ void ReadReplyUri(Envelope e, ServiceBusReceivedMessage serviceBusReceivedMessag if (serviceBusReceivedMessage.ApplicationProperties.TryGetValue("NServiceBus.ReplyToAddress", out var raw)) { - var queueName = (raw is byte[] b ? Encoding.Default.GetString(b) : raw.ToString())!; + var queueName = (raw is byte[] b ? Encoding.UTF8.GetString(b) : raw.ToString())!; e.ReplyUri = new Uri($"{Parent.Protocol}://queue/{queueName}"); } } @@ -265,7 +265,7 @@ void ReadReplyUri(Envelope e, ServiceBusReceivedMessage serviceBusReceivedMessag { if (msg.ApplicationProperties.TryGetValue("NServiceBus.EnclosedMessageTypes", out var raw)) { - var typeName = (raw is byte[] b ? Encoding.Default.GetString(b) : raw.ToString())!; + var typeName = (raw is byte[] b ? Encoding.UTF8.GetString(b) : raw.ToString())!; if (typeName.IsNotEmpty()) { var messageType = Type.GetType(typeName); diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusTopic.cs b/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusTopic.cs index 8d458f9a3..5662c3788 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusTopic.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusTopic.cs @@ -150,7 +150,7 @@ void ReadReplyUri(Envelope e, ServiceBusReceivedMessage serviceBusReceivedMessag if (serviceBusReceivedMessage.ApplicationProperties.TryGetValue("NServiceBus.ReplyToAddress", out var raw)) { - var queueName = (raw is byte[] b ? Encoding.Default.GetString(b) : raw.ToString())!; + var queueName = (raw is byte[] b ? Encoding.UTF8.GetString(b) : raw.ToString())!; e.ReplyUri = new Uri($"{Parent.Protocol}://queue/{queueName}"); } } @@ -161,7 +161,7 @@ void ReadReplyUri(Envelope e, ServiceBusReceivedMessage serviceBusReceivedMessag { if (msg.ApplicationProperties.TryGetValue("NServiceBus.EnclosedMessageTypes", out var raw)) { - var typeName = (raw is byte[] b ? Encoding.Default.GetString(b) : raw.ToString())!; + var typeName = (raw is byte[] b ? Encoding.UTF8.GetString(b) : raw.ToString())!; if (typeName.IsNotEmpty()) { var messageType = Type.GetType(typeName); diff --git a/src/Transports/Kafka/Wolverine.Kafka/IKafkaEnvelopeMapper.cs b/src/Transports/Kafka/Wolverine.Kafka/IKafkaEnvelopeMapper.cs index c6224e840..b06883a5a 100644 --- a/src/Transports/Kafka/Wolverine.Kafka/IKafkaEnvelopeMapper.cs +++ b/src/Transports/Kafka/Wolverine.Kafka/IKafkaEnvelopeMapper.cs @@ -33,7 +33,7 @@ public void MapEnvelopeToOutgoing(Envelope envelope, Message out } else if (envelope.Message != null) { - outgoing.Value = Encoding.Default.GetBytes(JsonSerializer.Serialize(envelope.Message, _options)); + outgoing.Value = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(envelope.Message, _options)); } else { diff --git a/src/Transports/Kafka/Wolverine.Kafka/Internals/KafkaEnvelopeMapper.cs b/src/Transports/Kafka/Wolverine.Kafka/Internals/KafkaEnvelopeMapper.cs index 7e5dc0851..cbf22b686 100644 --- a/src/Transports/Kafka/Wolverine.Kafka/Internals/KafkaEnvelopeMapper.cs +++ b/src/Transports/Kafka/Wolverine.Kafka/Internals/KafkaEnvelopeMapper.cs @@ -14,14 +14,14 @@ public KafkaEnvelopeMapper(Endpoint endpoint) : base(endpoint) protected override void writeOutgoingHeader(Message outgoing, string key, string value) { - outgoing.Headers.Add(key, Encoding.Default.GetBytes(value)); + outgoing.Headers.Add(key, Encoding.UTF8.GetBytes(value)); } protected override bool tryReadIncomingHeader(Message incoming, string key, out string value) { if (incoming.Headers.TryGetLastBytes(key, out var bytes)) { - value = Encoding.Default.GetString(bytes); + value = Encoding.UTF8.GetString(bytes); return true; } @@ -35,7 +35,7 @@ protected override void writeIncomingHeaders(Message incoming, E foreach (var header in incoming.Headers) { var bytes = header.GetValueBytes(); - envelope.Headers[header.Key] = bytes != null ? Encoding.Default.GetString(bytes) : null; + envelope.Headers[header.Key] = bytes != null ? Encoding.UTF8.GetString(bytes) : null; } } diff --git a/src/Transports/Kafka/Wolverine.Kafka/KafkaTopic.cs b/src/Transports/Kafka/Wolverine.Kafka/KafkaTopic.cs index cb5cbe881..7088fe0ae 100644 --- a/src/Transports/Kafka/Wolverine.Kafka/KafkaTopic.cs +++ b/src/Transports/Kafka/Wolverine.Kafka/KafkaTopic.cs @@ -149,7 +149,7 @@ public async ValueTask CheckAsync() await client.ProduceAsync(TopicName, new Message { Key = "ping", - Value = Encoding.Default.GetBytes("ping") + Value = Encoding.UTF8.GetBytes("ping") }); diff --git a/src/Transports/Kafka/Wolverine.Kafka/KafkaTopicGroup.cs b/src/Transports/Kafka/Wolverine.Kafka/KafkaTopicGroup.cs index 12236e81f..bd176f609 100644 --- a/src/Transports/Kafka/Wolverine.Kafka/KafkaTopicGroup.cs +++ b/src/Transports/Kafka/Wolverine.Kafka/KafkaTopicGroup.cs @@ -86,7 +86,7 @@ public override bool TryBuildDeadLetterSender(IWolverineRuntime runtime, out ISe await client.ProduceAsync(topicName, new Message { Key = "ping", - Value = System.Text.Encoding.Default.GetBytes("ping") + Value = System.Text.Encoding.UTF8.GetBytes("ping") }); } diff --git a/src/Transports/MQTT/Wolverine.MQTT.Tests/connectivity.cs b/src/Transports/MQTT/Wolverine.MQTT.Tests/connectivity.cs index b494420da..52c242a86 100644 --- a/src/Transports/MQTT/Wolverine.MQTT.Tests/connectivity.cs +++ b/src/Transports/MQTT/Wolverine.MQTT.Tests/connectivity.cs @@ -34,7 +34,7 @@ public async Task can_connect_to_a_local_broker() managedClient.ApplicationMessageReceivedAsync += e => { - _output.WriteLine(">> RECEIVED: " + e.ApplicationMessage.Topic + ", " + Encoding.Default.GetString(e.ApplicationMessage.PayloadSegment)); + _output.WriteLine(">> RECEIVED: " + e.ApplicationMessage.Topic + ", " + Encoding.UTF8.GetString(e.ApplicationMessage.PayloadSegment)); return CompletedTask.Instance; }; diff --git a/src/Transports/MQTT/Wolverine.MQTT/Internals/MqttListener.cs b/src/Transports/MQTT/Wolverine.MQTT/Internals/MqttListener.cs index d66b48c0c..3de43113d 100644 --- a/src/Transports/MQTT/Wolverine.MQTT/Internals/MqttListener.cs +++ b/src/Transports/MQTT/Wolverine.MQTT/Internals/MqttListener.cs @@ -100,7 +100,7 @@ public async Task ReceiveAsync(MqttApplicationMessageReceivedEventArgs args) { _logger.LogError(e, "Error trying to map an incoming MQTT message {MessageId} to an Envelope", args.ApplicationMessage.CorrelationData != null - ? Encoding.Default.GetString(args.ApplicationMessage.CorrelationData) + ? Encoding.UTF8.GetString(args.ApplicationMessage.CorrelationData) : "(none)"); // MoveToErrorsAsync keys the envelope by Id; the mapper threw before diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/sending_raw_messages.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/sending_raw_messages.cs index 9c38db510..42e0b68fa 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/sending_raw_messages.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/sending_raw_messages.cs @@ -172,7 +172,7 @@ public static async Task send_messages_with_raw_data() // The raw message data, but pretend this was sourced from a database // table or some other non-Wolverine storage in your system byte[] messageData - = Encoding.Default.GetBytes("{\"Name\": \"George Karlaftis\"}"); + = Encoding.UTF8.GetBytes("{\"Name\": \"George Karlaftis\"}"); #endregion diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEndpoint.NServiceBus.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEndpoint.NServiceBus.cs index 61ac84422..82346139f 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEndpoint.NServiceBus.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEndpoint.NServiceBus.cs @@ -36,7 +36,7 @@ void ReadReplyUri(Envelope e, IReadOnlyBasicProperties props) { if (props.Headers!.TryGetValue("NServiceBus.ReplyToAddress", out var raw)) { - var queueName = (raw is byte[] b ? Encoding.Default.GetString(b) : raw!.ToString())!; + var queueName = (raw is byte[] b ? Encoding.UTF8.GetString(b) : raw!.ToString())!; e.ReplyUri = new Uri($"{_parent.Protocol}://queue/{queueName}"); } } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEnvelopeMapper.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEnvelopeMapper.cs index db04762aa..9c8c0ac2b 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEnvelopeMapper.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEnvelopeMapper.cs @@ -68,7 +68,7 @@ protected override bool tryReadIncomingHeader(IReadOnlyBasicProperties incoming, if (incoming.Headers.TryGetValue(key, out var raw)) { - value = (raw is byte[] b ? Encoding.Default.GetString(b) : raw!.ToString())!; + value = (raw is byte[] b ? Encoding.UTF8.GetString(b) : raw!.ToString())!; return true; } @@ -82,7 +82,7 @@ protected override void writeIncomingHeaders(IReadOnlyBasicProperties incoming, foreach (var pair in incoming.Headers) { envelope.Headers[pair.Key] = - pair.Value is byte[] b ? Encoding.Default.GetString(b) : pair.Value?.ToString(); + pair.Value is byte[] b ? Encoding.UTF8.GetString(b) : pair.Value?.ToString(); } } } \ No newline at end of file