背景介绍
消息队列(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条消息消失。
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。