// 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();
}
}
}