Click here to Skip to main content
15,167,677 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
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:

C#
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:

C#
[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:

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

       [DataMember]
       public string Name;

       [DataMember]
       public object[] Parameters;
   }


Client :

C#
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

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



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900