static void SerializeDeliveryConstraint(DeliveryConstraint constraint, Dictionary <string, string> options) { if (constraint is NonDurableDelivery) { options["NonDurable"] = true.ToString(); return; } if (constraint is DoNotDeliverBefore doNotDeliverBefore) { options["DeliverAt"] = DateTimeExtensions.ToWireFormattedString(doNotDeliverBefore.At); return; } if (constraint is DelayDeliveryWith delayDeliveryWith) { options["DelayDeliveryFor"] = delayDeliveryWith.Delay.ToString(); return; } if (constraint is DiscardIfNotReceivedBefore discard) { options["TimeToBeReceived"] = discard.MaxTime.ToString(); return; } throw new Exception($"Unknown delivery constraint {constraint.GetType().FullName}"); }
static Message DispatchMessage(string queueName, MsmqSettings settings = null, DeliveryConstraint deliveryConstraint = null, Func <IReadOnlyDictionary <string, string>, string> messageLabelGenerator = null) { if (settings == null) { settings = new MsmqSettings(); } if (messageLabelGenerator == null) { messageLabelGenerator = _ => string.Empty; } var path = $@".\private$\{queueName}"; try { MsmqHelpers.DeleteQueue(path); MsmqHelpers.CreateQueue(path); var messageSender = new MsmqMessageDispatcher(settings, messageLabelGenerator); var bytes = new byte[] { 1 }; var headers = new Dictionary <string, string>(); var outgoingMessage = new OutgoingMessage("1", headers, bytes); var deliveryConstraints = new List <DeliveryConstraint>(); if (deliveryConstraint != null) { deliveryConstraints.Add(deliveryConstraint); } var transportOperation = new TransportOperation(outgoingMessage, new UnicastAddressTag(queueName), DispatchConsistency.Default, deliveryConstraints); messageSender.Dispatch(new TransportOperations(transportOperation), new TransportTransaction(), new ContextBag()); using (var queue = new MessageQueue(path)) using (var message = queue.Receive(TimeSpan.FromSeconds(5))) { return(message); } } finally { MsmqHelpers.DeleteQueue(path); } }