我在做一个MSMQ的项目时用到msmq 事务,本想用wcf 结合Msmq+IIS6.0, 但是看到一些资料,wcf+msmq 的宿主不可以是IIS6,IIS7 才 可以,我知IIS7多了一个WAS 功能,对MSMq可以监控。 using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Messaging; /// <summary> /// Summary description for MQ /// </summary> /// namespace Index { public class IMQ : IDisposable { protected MessageQueue queue; //消息队列 public virtual bool SendMessage(IndexForm idx, string MQPath, long ID) { bool send = false; queue = new MessageQueue(MQPath); MessageQueueTransaction transaction = new MessageQueueTransaction(); try { queue.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) }); // Create message Message message = new Message(); if (queue.Transactional) transaction.Begin(); //HttpContext.Current.Response.Write(MQPath); message.Body = idx.GenerateXmlFromID(ID); message.Label = ID.ToString(); // Put message into queue queue.Send(message, transaction); // 如果消息队列采用了事务,则停止事务 if (queue.Transactional) transaction.Commit(); send = true; } catch { // 如果消息队列采用了事务并且出现了异常,则终止事务 if (queue.Transactional) transaction.Abort(); send = false; } finally { queue.Close(); queue.Dispose(); } return send; } public virtual bool MQExists(string MQPath) { if (MessageQueue.Exists(MQPath)) return true; return false; //throw new Excep } public virtual void CreateMQ(string MQPath) { try { if (!MQExists(MQPath)) { MessageQueue.Create(MQPath,true); } } catch (MessageQueueException e) { } } public virtual Object Receive(string MQPath) { // Open queue queue = new MessageQueue(MQPath); MessageQueueTransaction transaction = new MessageQueueTransaction(); try { queue.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) }); ; if (queue.Transactional) transaction.Begin(); // Receive message, 同步的Receive方法阻塞当前执行线程,直到一个message可以得到 if (queue.GetAllMessages().Length > 0) { Message message = queue.Receive(new TimeSpan(0, 0, 2),transaction); //message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) }); // 如果消息队列采用了事务,则停止事务 if (queue.Transactional) transaction.Commit(); return message.Body.ToString(); } } catch { if (queue.Transactional) transaction.Abort(); return ""; } finally { queue.Close(); queue.Dispose(); } return ""; } //public virtual Object AsyReceive(string MQPath) //{ // queue.ReceiveCompleted += new ReceiveCompletedEventHandler(ReceivedEvt); //事件 // queue.BeginReceive(); //} //private static void ReceivedEvt(object source, ReceiveCompletedEventArgs asyncResult) //{ // try // { // MessageQueue mq = (MessageQueue)source; // Message m = mq.EndReceive(asyncResult.AsyncResult); // //此事m为异步接收到的消息 // //在此插入处理消息的代码 // mq.BeginReceive();//接收下一次事件 // } // catch (MessageQueueException) // { // } // return null; //} #region IDisposable Members public void Dispose() { queue.Dispose(); //throw new Exception("The method or operation is not implemented."); } #endregion } }