public static void CallSerializer() { HeaderSerializer.Serialize(new Dictionary <string, string>() { { "key1", "value1" }, { "key2", "value2" } }); }
async Task WriteMessage(string destination, IOutgoingTransportOperation transportOperation, TransportTransaction transaction) { var message = transportOperation.Message; var headerPayload = HeaderSerializer.Serialize(message.Headers); var headerSize = Encoding.UTF8.GetByteCount(headerPayload); if (headerSize + message.Body.Length > maxMessageSizeKB * 1024) { throw new Exception($"The total size of the '{message.Headers[Headers.EnclosedMessageTypes]}' message body ({message.Body.Length} bytes) plus headers ({headerSize} bytes) is larger than {maxMessageSizeKB} KB and will not be supported on some production transports. Consider using the NServiceBus DataBus or the claim check pattern to avoid messages with a large payload. Use 'EndpointConfiguration.UseTransport<LearningTransport>().NoPayloadSizeRestriction()' to disable this check and proceed with the current message size."); } var nativeMessageId = Guid.NewGuid().ToString(); var destinationPath = Path.Combine(basePath, destination); var bodyDir = Path.Combine(destinationPath, LearningTransportMessagePump.BodyDirName); Directory.CreateDirectory(bodyDir); var bodyPath = Path.Combine(bodyDir, nativeMessageId) + LearningTransportMessagePump.BodyFileSuffix; await AsyncFile.WriteBytes(bodyPath, message.Body) .ConfigureAwait(false); DateTime?timeToDeliver = null; if (transportOperation.DeliveryConstraints.TryGet(out DoNotDeliverBefore doNotDeliverBefore)) { timeToDeliver = doNotDeliverBefore.At; } else if (transportOperation.DeliveryConstraints.TryGet(out DelayDeliveryWith delayDeliveryWith)) { timeToDeliver = DateTime.UtcNow + delayDeliveryWith.Delay; } if (timeToDeliver.HasValue) { if (transportOperation.DeliveryConstraints.TryGet(out DiscardIfNotReceivedBefore timeToBeReceived) && timeToBeReceived.MaxTime < TimeSpan.MaxValue) { throw new Exception($"Postponed delivery of messages with TimeToBeReceived set is not supported. Remove the TimeToBeReceived attribute to postpone messages of type '{message.Headers[Headers.EnclosedMessageTypes]}'."); } // we need to "ceil" the seconds to guarantee that we delay with at least the requested value // since the folder name has only second resolution. if (timeToDeliver.Value.Millisecond > 0) { timeToDeliver += TimeSpan.FromSeconds(1); } destinationPath = Path.Combine(destinationPath, LearningTransportMessagePump.DelayedDirName, timeToDeliver.Value.ToString("yyyyMMddHHmmss")); Directory.CreateDirectory(destinationPath); } var messagePath = Path.Combine(destinationPath, nativeMessageId) + ".metadata.txt"; if (transportOperation.RequiredDispatchConsistency != DispatchConsistency.Isolated && transaction.TryGet(out ILearningTransportTransaction directoryBasedTransaction)) { await directoryBasedTransaction.Enlist(messagePath, headerPayload) .ConfigureAwait(false); } else { // atomic avoids the file being locked when the receiver tries to process it await AsyncFile.WriteTextAtomic(messagePath, headerPayload) .ConfigureAwait(false); } }