WCF NetMSMQBinding Example

MSMQ is Microsoft Message Queuing developed by Microsoft and deployed in windows operating system. MSMQ Queue ensures that reliable messaging between a client and a Windows Communication Foundation (WCF) service. So first we need to enable this feature in our operating system.

How to enable MSMQ

Press Window key + R, it will open Run window.

Enter ‘Control Panel’ and press ‘OK’ button, it will open control panel,

panel

Click on ‘Programs and Features’,

Programs and Features

From the left panel click on ‘Turn Windows features on or off’,

features

Select ‘Microsoft Message Queue (MSMQ) Server’ and all its child options.

Press ‘OK’ button, it will enable MSMQ for your operating system,

system

How to create a queue?

Press Window key + R, it will open Run window.

Enter ‘compmgmt.msc’ and press ‘OK’ button, it will open Computer Management window.

compmgmt

Under ‘Services and Applications’ expand ‘Message Queuing’.

Right click on ‘Private Queueus’, select ‘New’ and click on ‘Private Queue’.

Queue
Enter queue name, here I have entered ‘myqueue’, which we will use in our application later.

myqueue

You can find preceding queue under Private Queues.

Select ‘Private Queues’ and you will have list of all queues with details like Name, Label, Number of Messages and Number of Journal Messages.

Right click on ‘myqueue’ and select ‘Properties’,

Properties

Check ‘Journal Enabled’ checkbox,

Enabled

Select the user and allow full permission for this queue,

permission

Verify Queue Service is started

After creating and setting permissions for the queue, we need to verify if queue service is running or not.

Press Window key + R, it will open Run window,

Enter ‘services.msc’ and press ‘OK’ button, it will open Services window.

Services

Change below services status to ‘Running’,

  • Message Queuing
  • Message Queuing Triggers
  • Net.Msmq Listener Adapter

Services

Now let us create Service Application

Create WCF Service Application

Open Visual Studio Editor,

Select ‘File’ menu, expand ‘New’ and click on ‘Projects’,

Select ‘WCF’ from left panel, select ‘WCF Service Application’,

Provide appropriate name, select the location and press ‘OK’ button,

button

Right click on interfact IService1 and rename it to IQueueService,

IQueueService

Right click on Service1.svc and rename it to ‘QueueService.svc’,

QueueService

Right click on ‘QueueService.svc’ and click on ‘View Markup’,

Markup

Change the name of service to ‘WCFNetMSMQ.QueueService’,

  1. <%@ ServiceHost Language="C#" Debug="true" Service="WCFNetMSMQ.QueueService" CodeBehind="QueueService.svc.cs" %>  

Configure service and binding in the web.config under Service Model section. Under service we need to set endpoint with address, binding, contract and binding configuration,

  • Address – set queue address with net.msmq, use queuename which we have created previously in the last.
  • Binding – binding name which we will configure under bindings section.
  • Contract – Provide the interface name

  1. <services>  
  2.       <service name="WCFNetMSMQ.QueueService">  
  3.         <endpoint address="net.msmq://localhost/private/myqueue"   
  4.     binding="netMsmqBinding"   
  5.     bindingConfiguration="MsmqBindingConfig"   
  6.     contract="WCFNetMSMQ.IQueueService" />  
  7.       </service>  
  8.     </services>  

Configure binding under netMsmqBinding section. Set security as none.

  1. <bindings>  
  2.       <netMsmqBinding>  
  3.         <binding name="MsmqBindingConfig" exactlyOnce="false">  
  4.           <security mode="None" />  
  5.         </binding>  
  6.       </netMsmqBinding>  
  7.     </bindings>  

In the interface, we have operation contract namely ‘GetData’, Set ‘IsOneWay’ attribute as true and make return type as void.

  1. namespace WCFNetMSMQ  
  2. {  
  3.     [ServiceContract]  
  4.     public interface IQueueService  
  5.     {  
  6.         [OperationContract(IsOneWay=true)]  
  7.         void GetData(int value);  
  8.     }  
  9. }  

At the implementation part, trace the value which you are going to pass as parameter in the operation contract.

  1. namespace WCFNetMSMQ  
  2. {  
  3.     public class QueueService : IQueueService  
  4.     {  
  5.         public void GetData(int value)  
  6.         {  
  7.             System.Diagnostics.Trace.Write(string.Format("You entered: {0}", value));  
  8.         }  
  9.     }  
  10. }  

Now we are done with the service application having operation contract which accepts integer number and log it. In the next step we need to host our application in IIS.

Host WCF Service Application in IIS

Press Window key + R, it will open Run window.

Enter ‘inetmgr’ and press ‘OK’ button, it will open IIS window.

inetmgr

Expand the ‘Sites’ and you will find ‘Default Web Site’.

Right click on ‘Default Web Site’ and click on ‘Add Virtual Directory…’ in order to host the application,

application

Provide alias name and select our application physical path.

Press ‘OK’ button,

button

Right click on ‘WCFNetMSMQ’ and click on ‘Convert to Application’.

Convert

Click on ‘Select…’ button and select the application pool.

button

Select ‘.NET v4.5 Classic’ application pool and press ‘OK’ button.

button

In order to enable net.msmq protocol for this application, Right click on ‘WCFNetMSMQ’, expand ‘Manage Application’ and click on ‘Advanced Settings…’

Advanced

In Enabled Protocols add net.msmq along with http, It will enable net.msmq protocol for our application.

application

Now check whether configured site is working or not, Right click on ‘WCFNetMSMQ’, expand ‘Manage Application’ and click on ‘Browse’.

WCFNetMSMQ

In the browser we can see that service is running fine.

service

Now it’s time to create client application to consume service.

Create Client Application

Right click on Solution, expand ‘Add’ and click on ‘New Project…’.

new

Select ‘Visual C#’ from the left panel and select ‘Console Application’.

Provide appropriate name, select location and click on ‘OK’ button.

button

Add service reference in our client application, Right click on the project, expand ‘Add’ and click on ‘Service Reference…’,

Reference

Browse application from IIs and copy address from the address bar of the browser.

Paste same address in the ‘Add Service Reference’ window and press ‘Go’ Button.

Select ‘Queue Service’ from Services list.

Give the namespace and press ‘OK’ button.

namespace

Create an instance of QueueService client.

Call GetData operation contract using this instance,

  1. namespace WCFNetMSMQClient  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.             QueueServiceReference.QueueServiceClient serviceClient = new QueueServiceReference.QueueServiceClient();  
  8.             serviceClient.GetData(5677);  
  9.         }  
  10.     }  
  11. }  

In order to set client application as startup project, right click on solution and click on ‘Properties’,

Properties

Select client application under ‘Single Startup Project’,

Project

Now run the project and check ‘myqueue’ queue.

You can see that one message is added in Journal Messages.

Messages

Select Journal Messages under myqueue and you can see the message details like label, priority, class, size and message id.

details

The main benefit of using queue mechanism is if the destination server is offline when the client sends a message, the message will be queued on the client until the server comes back online.

Read more articles on WCF: