我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF在一个分布式的环境中,我们往往需要根据具体的情况采用不同的方式进行数据的传输。比如在一个Intranet内,我们一般通过TCP进行高效的数据通信;而在一个Internet的环境中,我们则通常使用Http进行跨平台的数据交换。而这些通信方式具有一个显著的特点,那就是他们是基于Connection的,也就是说,交互双方在进行通信的时候必须保证有一个可用的Connection存在于他们之间。而在某些时候,比如那些使用拨号连接的用户、以及使用便携式计算机的用户,我们不能保证在他们和需要访问的Server之间有一个的可靠的连接,在这种情况下,基于Messaging Queue的连接就显得尤为重要了。我们今天就来谈谈在WCF中如何使用MSMQ。

一、为什么要使用MSMQ

在一个分布式的环境中,我们往往需要根据具体的情况采用不同的方式进行数据的传输。比如在一个Intranet内,我们一般通过TCP进行高效的数据通信;而在一个Internet的环境中,我们则通常使用Http进行跨平台的数据交换。而这些通信方式具有一个显著的特点,那就是他们是基于Connection的,也就是说,交互双方在进行通信的时候必须保证有一个可用的Connection存在于他们之间。而在某些时候,比如那些使用拨号连接的用户、以及使用便携式计算机的用户,我们不能保证在他们和需要访问的Server之间有一个的可靠的连接,在这种情况下,基于Messaging Queue的连接就显得尤为重要了。我们今天就来谈谈在WCF中如何使用MSMQ。

MSMQ不仅仅是作为支持客户端连接工具而存在,合理的使用MSMQ可以在很大程度上提升系统的Performance和Scalability。我们先来看看MSMQ能给我们带来怎样的好处:

1.MSMQ是基于Disconnection

MSMQ通过Message Queue进行通信,这种通信方式为离线工作成为了可能。比如在介绍MSMQ时都会提到的Order Delivery的例子:在一个基于B2C的系统中,订单从各种各样的客户传来,由于 客户的各异性,不能保证每个客户在每时每刻都和用于接收订单的Server保持一个可靠的连接,我们有时候甚至允许客户即使在离线的情况下也可以递交订单(虽然订单不能发送到订单的接收方,但是我们可以通过某种机制保证先在本地保存该订单,一旦连接建立,则马上向接收方递交订单),而MSMQ则有效地提供了这样的机制:Server端建立一个Message Queue来接收来个客户的订单,客户端通过向该Message Queue发送承载了订单数据的Message实现订单的递交。如果在客户离线的情况下,他仍然可以通过客户端程序进行订单递交的操作,存储着订单数据的Message会被暂时保存在本地的Message Queue中,一旦客户联机,MSMQ将Message从中取出,发送到真正的接收方,而这个动作对于用户的透明的。

2.MSMQ天生是One-way、异步的

在MSMQ中,Message始终以One-way的方式进行发送,所以MSMQ具有天生的异步特性。所以MSMQ使用于那些对于用户的请求,Server端无需立即响应的场景。也就是说Server对数据的处理无需和Client的数据的发送进行同步,它可以独自地按照自己的Schedule进行工作。这可以避免峰值负载。比如Server端可以在一个相对低负载的时段(比如深夜)来对接收到的Order进行批处理,而无需一天24小时一直进行Order的监听、接收和处理。

3.MSMQ能够提供高质量的Reliable Messaging

我们知道,在一般的情况下,如果Client端以异步的方式对Service进行调用就意味着:Client无法获知Message是否成功抵达Service端;也不会获得Service端执行的结果和出错信息。但是我们仍然说MSMQ为我们提供了可靠的传输(Reliable Messaging),这主要是因为MSMQ为我们提供一些列Reliable Messaging的机制:


  • 超时机制(Timeout):可以设置发送和接收的时间,超出该时间则被认为操作失败。
  • 确认机制(Acknowledgement):当Message成功抵达Destination Queue,或者被成功接收,向发送端发送一个Acknowledgement message用以确认操作的状态。
  • 日志机制(Journaling):当Message被发送或接收后,被Copy一份存放在Journal Queue中。

此外,MSMQ还提供了死信队列(Dead letter Queue)用以保存发送失败的message。这一切保证了保证了Reliable Messaging。

二、 MSMQ在WCF的运用

在WCF中,MSMQ提供的数据传输功能被封装在一个Binding中,提供WCF Endpoint之间、以及Endpoint和现有的基于MSMQ的Application进行通信的实现。为此WCF为我们提供了两种不同的built-in binding:


  • NetMsmqBinding:从提供的功能和使用 方式上看,NetMsmqBinding和一般使用的binding,比如basicHttpBinding,netTcpBinding没有什么区别:在两个Endpoint之间实现了数据的通信,所不同的是,它提供的是基于MSMQ的Reliable Messaging。从变成模式上看,和一般的binding完全一样。
  • MsmqIntegrationBinding:从命名上我们可以看出,MsmqIntegrationBinding主要用于需要将我们的WCF Application和现有的基于MSMQ的Application集成的情况。MsmqIntegrationBinding实现了WCF Endpoint和某个Message Queue进行数据的通信,具体来说,就是实现了单一的向某个Message Queue 发送Message,和从某个Message Queue中接收Message的功能。从编程模式上看,也有所不同,比如Operation只接收一个MsmqMessage<T>的参数。

这是Client和Service通信的图示:

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_MSMQ_02

三、MSMQ和Transaction

MSMQ提供对Transaction的支持。在一般的情况下,MSMQ通过Message Queue Transaction实现对Transaction的原生的支持,借助Message Queue Transaction,可以把基于一个或多个Message Queue的相关操作纳入同一个Transaction中。

Message Queue Transaction仅仅限于基于Message Queue的操作,倘若操作涉及到另外一些资源,比如SQL Server, 则可以使用基于DTC的分布式Transaction

对于WCF中MSMQ,由于Client和Service的相对独立(可能Client发送Message到Service处理Message会相隔很长一段时间),所以Client和Service的操作只能纳入不同的Transaction中,如下图。

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_MSMQ_03
四、Sample1:NetMsmqBinding

我们首先做一个基于NetMsmqBinding Sample,实现的功能就是我们开篇所提出的Order Delivery。我们说过,NetMsmqBinding和一般的binding在实现的功能和变成模式上完全一样。下面是我们熟悉的4层结构:

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_04
1.Contract

DataContract:Order & OrderItem

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Collections.Generic;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Text;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Runtime.Serialization;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05namespace Artech.QueuedService.Contract

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_11我的WCF之旅(12):使用MSMQ进行Reliable Messaging_MSMQ_12我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [DataContract]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [KnownType(typeof(OrderItem))]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public class Order

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17 Private Fields#region Private Fields

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 private Guid _orderNo;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 private DateTime _orderDate;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 private Guid _supplierID;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 private string _supplierName;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 private IList<OrderItem> _orderItems;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 #endregion

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17 Constructors#region Constructors

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public Order()

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 this._orderItems = new List<OrderItem>();

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public Order(Guid orderNo, DateTime orderDate, Guid supplierID, string supplierName)

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 this._orderNo = orderNo;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 this._orderDate = orderDate;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 this._supplierID = supplierID;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 this._supplierName = supplierName;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 this._orderItems = new List<OrderItem>();

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 #endregion

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17 Public Properties#region Public Properties

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [DataMember]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public Guid OrderNo

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 get 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ return _orderNo; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 set 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ _orderNo = value; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [DataMember]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public DateTime OrderDate

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 get 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ return _orderDate; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 set 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ _orderDate = value; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [DataMember]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public Guid SupplierID

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 get 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ return _supplierID; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 set 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ _supplierID = value; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [DataMember]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public string SupplierName

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 get 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ return _supplierName; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 set 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ _supplierName = value; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [DataMember]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public IList<OrderItem> OrderItems

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 get 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ return _orderItems; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 set 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ _orderItems = value; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 #endregion

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17 Public Methods#region Public Methods

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public override string ToString()

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 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);

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 StringBuilder productList = new StringBuilder();

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 productList.AppendLine("\nProducts:");

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 int index = 0;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 foreach (OrderItem item in this._orderItems)

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 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));

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 return description + productList.ToString();

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 #endregion

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_143}

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Collections.Generic;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Text;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Runtime.Serialization;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05namespace Artech.QueuedService.Contract

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_11我的WCF之旅(12):使用MSMQ进行Reliable Messaging_MSMQ_12我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [DataContract]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public class OrderItem

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17 Private Fields#region Private Fields

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 private Guid _productID;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 private string _productName;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 private decimal _unitPrice;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 private int _quantity;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 #endregion

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17 Constructors#region Constructors

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public OrderItem()

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public OrderItem(Guid productID, string productName, decimal unitPrice, int quantity)

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 this._productID = productID;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 this._productName = productName;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 this._unitPrice = unitPrice;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 this._quantity = quantity;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 #endregion

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17 Public Properties#region Public Properties

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [DataMember]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public Guid ProductID

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 get 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ return _productID; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 set 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ _productID = value; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [DataMember]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public string ProductName

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 get 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ return _productName; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 set 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ _productName = value; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [DataMember]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public decimal UnitPrice

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 get 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ return _unitPrice; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 set 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ _unitPrice = value; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [DataMember]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public int Quantity

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 get 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ return _quantity; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18 set 我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{ _quantity = value; }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 #endregion

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_143}

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05


ServiceContract: IOrderProcessor

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Collections.Generic;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Text;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.ServiceModel;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05namespace Artech.QueuedService.Contract

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_11我的WCF之旅(12):使用MSMQ进行Reliable Messaging_MSMQ_12我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [ServiceContract]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [ServiceKnownType(typeof(Order))]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public interface IOrderProcessor

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [OperationContract(IsOneWay = true)]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 void Submit(Order order);

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_143}

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05

2.Service:IOrderProcessor

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Collections.Generic;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Text;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using Artech.QueuedService.Contract;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.ServiceModel;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05namespace Artech.QueuedService.Service

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_11我的WCF之旅(12):使用MSMQ进行Reliable Messaging_MSMQ_12我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public class OrderProcessorService:IOrderProcessor

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17 ISubmitOrder Members#region ISubmitOrder Members

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public void Submit(Order order)

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 Orders.Add(order);

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 Console.WriteLine("Receive an order.");

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 Console.WriteLine(order.ToString());

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 #endregion

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_143}

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Collections.Generic;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Text;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using Artech.QueuedService.Contract;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05namespace Artech.QueuedService.Service

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_11我的WCF之旅(12):使用MSMQ进行Reliable Messaging_MSMQ_12我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public static class Orders

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 private static IDictionary<Guid, Order> _orderList = new Dictionary<Guid, Order>();

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public static void Add(Order order)

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 _orderList.Add(order.OrderNo, order);

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 public static Order GetOrder(Guid orderNo)

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 return _orderList[orderNo];

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_143}

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05

3.Hosting

Configuration

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05<?xml version="1.0" encoding="utf-8" ?>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05<configuration>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <system.serviceModel>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <bindings>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <netMsmqBinding>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <binding name="msmqBinding">

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <security>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <transport msmqAuthenticationMode="None" msmqProtectionLevel="None" />

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <message clientCredentialType="None" />

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 </security>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 </binding>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 </netMsmqBinding>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 </bindings>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <services>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <service name="Artech.QueuedService.Service. OrderProcessorService">

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <endpoint address="net.msmq://localhost/private/orders" binding="netMsmqBinding"

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 bindingConfiguration="msmqBinding" contract="Artech.QueuedService.Contract.IOrderProcessor" />

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 </service>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 </services>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 </system.serviceModel>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05</configuration>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05

在默认的情况下,netMsmqBinding 的msmqAuthenticationModeWindowsDomain,由于基于WindowsDomain必须安装AD,利于在本机模拟,我把msmqAuthenticationMode改为None,相应的ProtectionLevel和clientCredentialType改为None。

Program:

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Collections.Generic;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Text;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Messaging;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.ServiceModel;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using Artech.QueuedService.Service;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05namespace Artech.QueuedService.Hosting

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_11我的WCF之旅(12):使用MSMQ进行Reliable Messaging_MSMQ_12我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 class Program

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 static void Main(string[] args)

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 string path = @".\private$\orders";

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 if(!MessageQueue.Exists(path))

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 MessageQueue.Create(path,true);

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 using (ServiceHost host = new ServiceHost(typeof(OrderProcessorService)))

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 host.Opened += delegate

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 Console.WriteLine("Service has begun to listen我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13\n\n");

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 };

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 host.Open();

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 Console.Read();

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_143}

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05

在Host Service之前,通过MessageQueue.Create创建一个Message Queue,第二个参数为表明Queue是否支持Transaction的indicator,这里支持Transaction。

4.Client:

Configuration

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05<?xml version="1.0" encoding="utf-8" ?>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05<configuration>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <system.serviceModel>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <bindings>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <netMsmqBinding>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <binding name="msmqBinding">

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <security>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <transport msmqAuthenticationMode="None" msmqProtectionLevel="None" />

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <message clientCredentialType="None" />

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 </security>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 </binding>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 </netMsmqBinding>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 </bindings>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <client>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 <endpoint address="net.msmq://localhost/private/orders" binding="netMsmqBinding"

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 bindingConfiguration="msmqBinding" contract="Artech.QueuedService.Contract.IOrderProcessor"

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 name="defaultEndpoint" />

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 </client>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05 </system.serviceModel>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05</configuration>

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05

Program

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Collections.Generic;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Text;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using Artech.QueuedService.Contract;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.ServiceModel;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05using System.Transactions;

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05namespace Artech.QueuedService.Client

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_11我的WCF之旅(12):使用MSMQ进行Reliable Messaging_MSMQ_12我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 class Program

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 static void Main(string[] args)

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 ChannelFactory<IOrderProcessor> channelFactory = new ChannelFactory<IOrderProcessor>("defaultEndpoint");

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 IOrderProcessor channel = channelFactory.CreateChannel();

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 Order order = new Order(Guid.NewGuid(),DateTime.Today,Guid.NewGuid(),"A Company");

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 order.OrderItems.Add(new OrderItem(Guid.NewGuid(),"PC",5000,20));

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 order.OrderItems.Add(new OrderItem(Guid.NewGuid(),"Printer",7000,2));

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 Console.WriteLine("Submit order to server");

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_17我的WCF之旅(12):使用MSMQ进行Reliable Messaging_Reliabe Messaging_18我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_13{

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 channel.Submit(order);

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 scope.Complete();

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_数据_14 Console.Read();

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_27 }

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_WCF_143}

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_05

先后运行Host和Client,Host端有下面的输出:

我的WCF之旅(12):使用MSMQ进行Reliable Messaging_离线_453