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 interface 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: