Click here to Skip to main content
13,139,569 members (55,621 online)
Rate this:
 
Please Sign up or sign in to vote.
See more:
I have a WCF Windows Service that retrieve MSMQ messages. The SubmitPurchaseOrderInMessage doesn't seem to get called neither do I see any messages in the queue. Code is shown below.

WCF class:

 public class OrderProcessorService : IOrderProcessor
    {
        
 
        [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
        [ServiceKnownType(typeof(MyOrder))]
        public void SubmitPurchaseOrderInMessage(MsmqMessage<MyOrder> ordermsg)
        {
            MyOrder po = (MyOrder)ordermsg.Body;
            Console.WriteLine("Processing id:{0}, name:{1} ", po.ID, po.Name);
        }
 
      
 

     
        public static void Main()
        {
            //init queue
            if (!MessageQueue.Exists(Constants.QUEUE_PATH)) MessageQueue.Create(Constants.QUEUE_PATH, true);
 

            //init wcf host via code
            Uri baseUri = new Uri("http://localhost:7878/msmqsvc");
            using (ServiceHost host = new ServiceHost(typeof(OrderProcessorService),baseUri))
            {
                //add metadata behavior
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior(){ HttpGetEnabled=true};
                host.Description.Behaviors.Add(smb);
 
                //add service endpoint
                MsmqIntegrationBinding binding = new MsmqIntegrationBinding(MsmqIntegrationSecurityMode.None);
                binding.SerializationFormat = MsmqMessageSerializationFormat.Binary;
                host.AddServiceEndpoint(typeof(ClassLib.IOrderProcessor), binding, "msmq.formatname:DIRECT=OS:" + Constants.QUEUE_PATH);
 
                host.Open();
 

                // The service can now be accessed.
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.ReadLine();
                host.Close();
            }
        }
 
    }


Interface Contract:

 [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
    [ServiceKnownType(typeof(MyOrder))]
    public interface IOrderProcessor
    {
        [OperationContract(IsOneWay = true, Action = "*")]
        void SubmitPurchaseOrderInMessage(MsmqMessage<MyOrder> msg);
 
    }


The array Parameters can be any dynamic serializable type that can be passed by client. I think issue is with this parameter. If I remove this parameter and the serializable attribute and also the binding.SerializationFormat in the client, then eveything works fine.

Serializable class:

 [DataContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
    [Serializable]
    public class MyOrder
    {
        [DataMember]
        public string ID;
 
        [DataMember]
        public string Name;
      
        [DataMember]
        public object[] Parameters;
    }


Client :

class Program
     {
        static void Main(string[] args)
        {
            try
            {
                Run();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
 
        static void Run()
        {
            MsmqIntegrationBinding binding = new MsmqIntegrationBinding();
            binding.Security.Mode = MsmqIntegrationSecurityMode.None;
            binding.Security.Transport.MsmqAuthenticationMode = MsmqAuthenticationMode.None;
            binding.Security.Transport.MsmqProtectionLevel = System.Net.Security.ProtectionLevel.None;
            binding.SerializationFormat = MsmqMessageSerializationFormat.Binary;
            EndpointAddress address = new EndpointAddress("msmq.formatname:DIRECT=OS:" + Constants.QUEUE_PATH);
          
          
            ChannelFactory<ClassLib.IOrderProcessor> channelFactory = new ChannelFactory<ClassLib.IOrderProcessor>(binding, address);
 
            try
            {
                ClassLib.IOrderProcessor channel = channelFactory.CreateChannel();
 
                MyOrder order = new MyOrder();
                order.ID = DateTime.Now.Ticks.ToString();
                order.Name = "Order_" + order.ID;
               order.Parameters = new object[] { new Transaction { Amount = 108 }, new Transaction { Amount = 100 } };
                MsmqMessage<MyOrder> ordermsg = new MsmqMessage<MyOrder>(order);
                using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
                {
                    channel.SubmitPurchaseOrderInMessage(ordermsg);
                    scope.Complete();
                }
                Console.WriteLine("Order has been submitted:{0}", ordermsg);
            }
            catch(Exception ex)
            {
 
            }
            finally
            {
                channelFactory.Close();
            }
 
        }
    }
    [Serializable]
    public class Transaction
    {
        public int Amount { get; set; }
    }
Posted 29-Jun-14 19:55pm

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
Top Experts
Last 24hrsThis month


Advertise | Privacy |
Web02 | 2.8.170915.1 | Last Updated 30 Jun 2014
Copyright © CodeProject, 1999-2017
All Rights Reserved. Terms of Service
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100