背景介绍
消息队列(MSMQ)在WCF中又进一步做了封装,实现了服务端未在线时,客户端发送的消息缓存在消息队列中,等服务端再次启动时,自动接收消息的功能。
Demo
服务端结构
业务模型 OrderEntry
[DataContract] public class OrderEntry { [DataMember] public int OrderID { get; set; } [DataMember] public DateTime OrderDate { get; set; } [DataMember] public int Quantity { get; set; } [DataMember] public int UnitPrice { get; set; } public override string ToString() { return string.Format( "ID:{0}\tDate:{1}\tQuantity:{2}\tUnitPrice:{3}\t", OrderID, OrderDate, Quantity, UnitPrice); } }
服务契约
[ServiceContract] public interface IMSMQService { [OperationContract(IsOneWay = true)] void PlaceOrder(OrderEntry entry); }
实现契约的服务
public class MSMQService : IMSMQService { #region IMSMQService 成员 public void PlaceOrder(OrderEntry entry) { Console.WriteLine("收到订单:{0}", entry.ToString()); } #endregion }
另启动一个控制台app,host刚才的WCF服务。
class Program { static void Main(string[] args) { ServiceHost _selfHost = null; try { //step 0 create MessageQueue instance string queueName = @".\Private$\ReportService"; MessageQueue mq = null; if (!MessageQueue.Exists(queueName)) mq = MessageQueue.Create(queueName); // Step 1 Create a URI to serve as the base address. //This address is the service address and client referes it Uri baseAddress = new Uri("net.msmq://localhost/private/ReportService"); // Step 2 Create a ServiceHost instance _selfHost = new ServiceHost(typeof(MSMQService), baseAddress); // Step 3 Add a service endpoint for host instance. NetMsmqBinding queBinding = new NetMsmqBinding(NetMsmqSecurityMode.None); queBinding.ExactlyOnce = false; queBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; _selfHost.AddServiceEndpoint(typeof(IMSMQService), queBinding, ""); // Step 4 Enable metadata exchange. ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = false; _selfHost.Description.Behaviors.Add(smb); // Step 5 Start the service. _selfHost.Open(); Console.WriteLine("服务器已经准备好"); Console.Read(); } catch (CommunicationException ce) { Console.WriteLine("An exception occurred: {0}", ce.Message); _selfHost.Abort(); } } }
客户端结构
客户端建立一个控制台app,并添加对以上服务的引用,连续发送3个订单,并不启动服务端。
class Program { static void Main(string[] args) { NetMsmqBinding binding = new NetMsmqBinding(NetMsmqSecurityMode.None); binding.ExactlyOnce = false; binding.Durable = true; ChannelFactory<IMSMQService> channel = new ChannelFactory<IMSMQService>( binding, new EndpointAddress("net.msmq://localhost/Private/ReportService")); IMSMQService client = channel.CreateChannel(); client.PlaceOrder( new OrderEntry() { OrderID = 1, OrderDate = DateTime.Now, UnitPrice = 10, Quantity = 10 }); Console.WriteLine("发送了一个订单"); client.PlaceOrder( new OrderEntry() { OrderID = 2, OrderDate = DateTime.Now, UnitPrice = 20, Quantity = 5 }); Console.WriteLine("发送了一个订单"); client.PlaceOrder( new OrderEntry() { OrderID = 3, OrderDate = DateTime.Now, UnitPrice = 45, Quantity = 3 }); Console.WriteLine("发送了一个订单"); Console.Read(); } }
打开控制面板-服务-消息队列-找到ReportService队列,可看到此时缓存了3条发送的消息。然后运行服务端,此时显示收到了3条订单,并且消息队列中的3条消息消失。
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。