曾几何时 再看大家讨论各种构架时,经常出现在各个服务器间传递数据,经常出现MSMQ,
那是看到这个心理就郁闷,怎么整天折腾ASP.NET 就没遇见过这个东西
原来这个家伙藏在WCF里面
嘿嘿这次被我发现了
首先 第一次装IIS的话 默认是没有安装msmq 所以需要自己安装的
看Artech 的介绍 这个东西在不能时刻保持和服务器连接的情况下 使用非常有用
对于以WEB为构架为核心的 系统我虽然不知道这个东西有什么用
但我觉得在移动应用中这个东西应该比较有用
移动客户端和服务器端总是若离若弃
但不知道 移动客户端支不支持 这个东西 例如 WINCE ,wp7 支不支持
项目结构图如下
代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Transactions;
using cfContract;
namespace cfClient
{
class Program
{
static void Main(string[] args)
{
ChannelFactory<IOrderProcessor> channelFactory = new ChannelFactory<IOrderProcessor>("defaultEndpoint");
IOrderProcessor channel = channelFactory.CreateChannel();
Order order = new Order(Guid.NewGuid(), DateTime.Today, Guid.NewGuid(), "A Company");
order.OrderItems.Add(new OrderItem(Guid.NewGuid(), "PC", 5000, 20));
order.OrderItems.Add(new OrderItem(Guid.NewGuid(), "Printer", 7000, 2));
Console.WriteLine("Submit order to server");
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
channel.Submit(order);
scope.Complete();
}
Console.Read();
}
}
}
==================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
namespace cfContract
{
[ServiceContract]
[ServiceKnownType(typeof(Order))]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true)]
void Submit(Order order);
}
}
=================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;
namespace cfContract
{
[DataContract]
[KnownType(typeof(OrderItem))]
public class Order
{
#region Private Fields
private Guid _orderNo;
private DateTime _orderDate;
private Guid _supplierID;
private string _supplierName;
private IList<OrderItem> _orderItems;
#endregion
#region Constructors
public Order()
{
this._orderItems = new List<OrderItem>();
}
public Order(Guid orderNo, DateTime orderDate, Guid supplierID, string supplierName)
{
this._orderNo = orderNo;
this._orderDate = orderDate;
this._supplierID = supplierID;
this._supplierName = supplierName;
this._orderItems = new List<OrderItem>();
}
#endregion
#region Public Properties
[DataMember]
public Guid OrderNo
{
get { return _orderNo; }
set { _orderNo = value; }
}
[DataMember]
public DateTime OrderDate
{
get { return _orderDate; }
set { _orderDate = value; }
}
[DataMember]
public Guid SupplierID
{
get { return _supplierID; }
set { _supplierID = value; }
}
[DataMember]
public string SupplierName
{
get { return _supplierName; }
set { _supplierName = value; }
}
[DataMember]
public IList<OrderItem> OrderItems
{
get { return _orderItems; }
set { _orderItems = value; }
}
#endregion
#region Public Methods
public override string ToString()
{
string description = string.Format("General Informaion:\n\tOrder No.\t: {0}\n\tOrder Date\t: {1}\n\tSupplier No.\t: {2}\n\tSupplier Name\t: {3}", this._orderNo, this._orderDate.ToString("yyyy/MM/dd"), this._supplierID, this._supplierName);
StringBuilder productList = new StringBuilder();
productList.AppendLine("\nProducts:");
int index = 0;
foreach (OrderItem item in this._orderItems)
{
productList.AppendLine(string.Format("\n{4}. \tNo.\t\t: {0}\n\tName\t\t: {1}\n\tPrice\t\t: {2}\n\tQuantity\t: {3}", item.ProductID, item.ProductName, item.UnitPrice, item.Quantity, ++index));
}
return description + productList.ToString();
}
#endregion
}
}
==================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text;
using System.Runtime.Serialization;
namespace cfContract
{
public class OrderItem
{
#region Private Fields
private Guid _productID;
private string _productName;
private decimal _unitPrice;
private int _quantity;
#endregion
#region Constructors
public OrderItem()
{ }
public OrderItem(Guid productID, string productName, decimal unitPrice, int quantity)
{
this._productID = productID;
this._productName = productName;
this._unitPrice = unitPrice;
this._quantity = quantity;
}
#endregion
[DataMember]
public Guid ProductID
{
get { return _productID; }
set { _productID = value; }
}
[DataMember]
public string ProductName
{
get { return _productName; }
set { _productName = value; }
}
[DataMember]
public decimal UnitPrice
{
get { return _unitPrice; }
set { _unitPrice = value; }
}
[DataMember]
public int Quantity
{
get { return _quantity; }
set { _quantity = value; }
}
}
}
===========================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Messaging;
using cfService;
namespace cfHosting
{
class Program
{
static void Main(string[] args)
{
string path = @".\private$\orders";
//此计算机上尚未安装消息队列
if (!MessageQueue.Exists(path))
{
MessageQueue.Create(path, true);
}
using (ServiceHost host = new ServiceHost(typeof(OrderProcessorService)))
{
host.Opened += delegate
{
Console.WriteLine("Service has begun to listen\n\n");
};
host.Open();
Console.Read();
}
}
}
}
==========================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using cfContract;
namespace cfService
{
public class OrderProcessorService:IOrderProcessor
{
[OperationBehavior(TransactionScopeRequired=true,TransactionAutoComplete=true)]
void IOrderProcessor.Submit(Order order)
{
Orders.Add(order);
Console.WriteLine("Receive an order.");
Console.WriteLine(order.ToString());
}
}
}
===========================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cfContract;
namespace cfService
{
public static class Orders
{
private static IDictionary<Guid, Order> _orderList = new Dictionary<Guid, Order>();
public static void Add(Order order)
{
_orderList.Add(order.OrderNo, order);
}
public static Order GetOrder(Guid orderNo)
{
return _orderList[orderNo];
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
服务器端配置
<system.serviceModel>
<bindings>
<netMsmqBinding>
<binding name="msmqBinding">
<security>
<transport msmqAuthenticationMode="None" msmqProtectionLevel="None" />
<message clientCredentialType="None" />
</security>
</binding>
</netMsmqBinding>
</bindings>
<services>
<service name="cfService.OrderProcessorService">
<endpoint address="" binding="netMsmqBinding"
bindingConfiguration="msmqBinding" contract="cfContract.IOrderProcessor" />
<host>
<baseAddresses>
<add baseAddress="net.msmq://localhost/private/orders"/>
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
客户端配置
<system.serviceModel>
<bindings>
<netMsmqBinding>
<binding name="msmqBinding">
<security>
<transport msmqAuthenticationMode="None" msmqProtectionLevel="None" />
<message clientCredentialType="None" />
</security>
</binding>
</netMsmqBinding>
</bindings>
<client>
<endpoint address="net.msmq://localhost/private/orders" binding="netMsmqBinding"
bindingConfiguration="msmqBinding" contract="cfContract.IOrderProcessor"
name="defaultEndpoint" />
</client>
</system.serviceModel>
