Introduction:
In this article,i am going to explain about how to create/perform the
duplex service contracts in wcf.
Main:
Duplex is simply ‘Receiving information/Messages from both client and server’.
Duplex clients differ from datagram clients and request-reply clients in that
they must implement a callback service. The client can make requests of the s
ervice, but the service can also make requests of the client.
Service contracts for duplex services are paired up with a client callback
contract. The service-side contract for the service has a [ServiceContract] attribute
and specifies the name of the client callback contract with a CallbackContract =typeof(contract)
parameter. The client callback service contract does not require a [ ServiceContract] attribute.
See the below demonstration,In this demonstartion i am going to create 3 applications,
1.WCF service,
2.Windows application for hosting wcf service
3.windows application for wcf client,
For Creating wcf application just goto
File –> New –> Project –> Select WCF tab and named it WCFService(see the pic below),
Copy and paste this below code,
using System;
using System.ServiceModel;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.IO;
namespace WCFService
{
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract=typeof(IServiceDuplexCallback))]
public interface IServiceClass
{
[OperationContract(IsOneWay=true)]
void AddNumber(int number);
}
public interface IServiceDuplexCallback
{
[OperationContract(IsOneWay = true)]
void Calculate(int result);
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class ServiceClass : IServiceClass
{
public void AddNumber(int number)
{
callback.Calculate(number+10);// client method invocation
}
IServiceDuplexCallback callback
{
get { return OperationContext.Current.GetCallbackChannel<IServiceDuplexCallback>(); }
}
}
}
using System; using System.ServiceModel; using System.Collections.Generic; using System.Runtime.Serialization; using System.IO; namespace WCFService { [ServiceContract(SessionMode = SessionMode.Required, CallbackContract=typeof(IServiceDuplexCallback))] public interface IServiceClass { [OperationContract(IsOneWay=true)] void AddNumber(int number); } public interface IServiceDuplexCallback { [OperationContract(IsOneWay = true)] void Calculate(int result); } [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)] public class ServiceClass : IServiceClass { public void AddNumber(int number) { callback.Calculate(number+10);// client method invocation } IServiceDuplexCallback callback { get { return OperationContext.Current.GetCallbackChannel<IServiceDuplexCallback>(); } } } } |
Now we created a wcf service,next we need to host this service,for hosting
File –> New –> Project –> Select windows application and named it WCFHostService(See the pic below),

Copy and paste this below code,
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.ServiceModel;
using System.ServiceModel.Description;
using WCFService;
using System.Configuration;
namespace WCFServiceHost
{
public partial class Form1 : Form
{
ServiceHost local_sh = null;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Uri local_tcp = new Uri("net.tcp://localhost:8080/TcpBinding");
local_sh = new ServiceHost(typeof(Service1), local_tcp);
NetTcpBinding local_tcpb = new NetTcpBinding();
ServiceMetadataBehavior local_mbehave = new ServiceMetadataBehavior();
local_sh.Description.Behaviors.Add(local_mbehave);
local_sh.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
local_sh.AddServiceEndpoint(typeof(IServiceClass), local_tcpb, local_tcp);
local_sh.Open();
label1.Text = "Service Running";
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
local_sh.Close();
}
}
}
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.ServiceModel; using System.ServiceModel.Description; using WCFService; using System.Configuration; namespace WCFServiceHost { public partial class Form1 : Form { ServiceHost local_sh = null; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Uri local_tcp = new Uri("net.tcp://localhost:8080/TcpBinding"); local_sh = new ServiceHost(typeof(Service1), local_tcp); NetTcpBinding local_tcpb = new NetTcpBinding(); ServiceMetadataBehavior local_mbehave = new ServiceMetadataBehavior(); local_sh.Description.Behaviors.Add(local_mbehave); local_sh.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex"); local_sh.AddServiceEndpoint(typeof(IServiceClass), local_tcpb, local_tcp); local_sh.Open(); label1.Text = "Service Running"; } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { local_sh.Close(); } } } |
Next we need to create a client,for creating client application,
File –> New –> Project –> Select New Windows application and named it WcfClientApplication,
Before we code the client application,we need to add the service reference,for adding service reference
1.make host application is running,
2.Right click the references tab,and select add service references,
In client application we need to maintain a callback handler for handling server responses,
InstanceContext ic = new InstanceContext(new CallbackHandler());
ServiceReference1.ServiceClassClient objclient =
new WcfClientApplication.ServiceReference1.ServiceClassClient(ic);
int value = Int32.Parse(textBox1.Text);
objclient.AddNumber(value);
public class CallbackHandler : ServiceReference1.IServiceClassCallback
{
public void Calculate(int result)
{
MessageBox.Show("result from callback by service:" + result.ToString());
}
}
InstanceContext ic = new InstanceContext(new CallbackHandler()); ServiceReference1.ServiceClassClient objclient = new WcfClientApplication.ServiceReference1.ServiceClassClient(ic); int value = Int32.Parse(textBox1.Text); objclient.AddNumber(value); public class CallbackHandler : ServiceReference1.IServiceClassCallback { public void Calculate(int result) { MessageBox.Show("result from callback by service:" + result.ToString()); } } |
Build it and run the application,



