// WCF.MSMQ.Message.Sender.(WCF.to.MSMQ).cs namespace WCF.MSMQ.MessageSender.Host { using System; using System.Transactions; using System.ServiceModel.MsmqIntegration; using System.ServiceModel; using Contracts.Entitys; using Contracts.Operations; using Contracts.Operations.ClientsProxys; class Program { static void Main(string[] args) { Console.Title = "Sender"; // Create the purchase order PurchaseOrder po = new PurchaseOrder(); po.customerId = "somecustomer.com"; po.poNumber = Guid.NewGuid().ToString(); PurchaseOrderLineItem lineItem1 = new PurchaseOrderLineItem(); lineItem1.productId = "Blue Widget"; lineItem1.quantity = 54; lineItem1.unitCost = 29.99F; PurchaseOrderLineItem lineItem2 = new PurchaseOrderLineItem(); lineItem2.productId = "Red Widget"; lineItem2.quantity = 890; lineItem2.unitCost = 45.89F; po.orderLineItems = new PurchaseOrderLineItem[2]; po.orderLineItems[0] = lineItem1; po.orderLineItems[1] = lineItem2; string queueAddress = @"msmq.formatname:DIRECT=OS:.\private$\Orders"; MsmqIntegrationBinding binding = new MsmqIntegrationBinding(); binding.Security.Transport.MsmqAuthenticationMode = MsmqAuthenticationMode.None; binding.Security.Mode = MsmqIntegrationSecurityMode.None; EndpointAddress address = new EndpointAddress(queueAddress); ChannelFactory<IOrderProcessor> factory = new ChannelFactory<IOrderProcessor>(binding, new EndpointAddress(queueAddress)); IOrderProcessor proxy = factory.CreateChannel(); OrderProcessorClient client = new OrderProcessorClient(binding, address); int count = 1; string input = string.Empty; while ("q" != (input = Console.ReadLine().ToLower())) { for (int i = 0; i < 1000 ; i++) { po.count = count++; MsmqMessage<PurchaseOrder> ordermsg = new MsmqMessage<PurchaseOrder>(po); using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required)) { client.SubmitPurchaseOrder(ordermsg); scope.Complete(); } } Console.WriteLine("WCF to MSMQ:"); Console.WriteLine("Order has been submitted:{0}", po); } //Closing the client gracefully closes the connection and cleans up resources client.Close(); Console.WriteLine(); Console.WriteLine("Press <ENTER> to terminate client."); Console.ReadLine(); } } } namespace Contracts.Operations.ClientsProxys { using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.MsmqIntegration; using Contracts.Entitys; public partial class OrderProcessorClient : ClientBase<IOrderProcessor>, IOrderProcessor { /// public OrderProcessorClient() /// { /// } /// /// public OrderProcessorClient(string configurationName) /// : /// base(configurationName) /// { /// } public OrderProcessorClient(Binding binding, EndpointAddress address) : base(binding, address) { } public void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg) { base.Channel.SubmitPurchaseOrder(msg); } } } //================================================================================================================= // WCF.MSMQ.Message.Receiver.(MSMQ.to.WCF).cs namespace WCF.MSMQ.MessageReceiver.Host { using System; using System.ServiceModel; using System.ServiceModel.MsmqIntegration; using System.Messaging; using Contracts.Operations; using Contracts.Entitys; public class OrderProcessorService : IOrderProcessor { [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] public void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> ordermsg) { PurchaseOrder po = ordermsg.Body; Random statusIndexer = new Random(); po.Status = (OrderStates)statusIndexer.Next(3); Console.WriteLine("Processing {0} ", po); } // Host the service within this EXE console application. public static void Main() { // Get MSMQ queue name from app settings in configuration Console.Title = "Receiver"; string queueName = @".\private$\Orders";//ConfigurationManager.AppSettings["orderQueueName"]; // Create the transacted MSMQ queue if necessary. if (!MessageQueue.Exists(queueName)) { MessageQueue.Create(queueName, true); } // Create a ServiceHost for the OrderProcessorService type. using (ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService))) { string queueAddress = @"msmq.formatname:DIRECT=OS:.\private$\Orders"; MsmqIntegrationBinding binding = new MsmqIntegrationBinding(); binding.Security.Transport.MsmqAuthenticationMode = MsmqAuthenticationMode.None; binding.Security.Mode = MsmqIntegrationSecurityMode.None; serviceHost.AddServiceEndpoint(typeof(IOrderProcessor), binding, queueAddress); serviceHost.Open(); // The service can now be accessed. Console.WriteLine("The MSMQ to WCF service is ready."); Console.WriteLine("Press <ENTER> to terminate service."); Console.ReadLine(); } } } } //================================================================================================================= // Contracts.Share.cs namespace Contracts.Operations { using System.ServiceModel; using System.ServiceModel.MsmqIntegration; using Contracts.Entitys; // Define a service contract. [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] [ServiceKnownType(typeof(PurchaseOrder))] public interface IOrderProcessor { [OperationContract(IsOneWay = true, Action = "*")] void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg); } } namespace Contracts.Entitys { using System; using System.Text; // Define the Purchase Order Line Item [Serializable] public class PurchaseOrderLineItem { public string productId; public float unitCost; public int quantity; public override string ToString() { string displayString = "Order LineItem: " + quantity + " of " + productId + " @unit price: $" + unitCost + "\n"; return displayString; } public float TotalCost { get { return unitCost * quantity; } } } public enum OrderStates { Pending, Processed, Shipped } // Define Purchase Order [Serializable] public class PurchaseOrder { public static string[] orderStates = { "Pending", "Processed", "Shipped" }; public int count; public string poNumber; public string customerId; public PurchaseOrderLineItem[] orderLineItems; public OrderStates orderStatus; public float TotalCost { get { float totalCost = 0; foreach (PurchaseOrderLineItem lineItem in orderLineItems) totalCost += lineItem.TotalCost; return totalCost; } } public OrderStates Status { get { return orderStatus; } set { orderStatus = value; } } public override string ToString() { StringBuilder strbuf = new StringBuilder("Purchase Order: " + poNumber + "\n"); strbuf.Append("\tCustomer: " + customerId + "\n"); strbuf.Append("\tOrderDetails\n"); foreach (PurchaseOrderLineItem lineItem in orderLineItems) { strbuf.Append("\t\t" + lineItem.ToString()); } strbuf.Append("\tTotal cost of this order: $" + TotalCost + "\n"); strbuf.Append("\tOrder status: " + Status + "\n"); strbuf.Append("\tOrder count: " + count + "\n"); return strbuf.ToString(); } } }